Wie arbeitet GLOBIGNORE?

14

Laut bashs Handbuchseite:

   GLOBIGNORE
          A colon-separated list of patterns defining the set of filenames
          to be ignored by pathname expansion.  If a filename matched by a
          pathname  expansion  pattern also matches one of the patterns in
          GLOBIGNORE, it is removed from the list of matches.

In der Praxis jedoch ...

$ bash --noprofile --norc
bash-4.2$ touch .bar
bash-4.2$ echo .*
. .. .bar
bash-4.2$ GLOBIGNORE=.
bash-4.2$ echo .*
.bar

Warum wird ..aus der Liste der Übereinstimmungen entfernt? Soweit ich weiß, .stimmt das Muster NICHT überein .., oder?

Ernest A
quelle

Antworten:

14

Scrolle runter ...

Die Dateinamen .und ..werden immer ignoriert, wenn GLOBIGNOREfestgelegt und nicht null.

In den meisten Fällen ist es nicht wünschenswert, .und ..als Wildcard-Übereinstimmungen aufzunehmen, da sie keine Dateien innerhalb des Verzeichnisses darstellen - sie sind Hacks, damit die Verzeichnisnavigation funktioniert. Tatsächlich ist der Ursprung von Punktdateien ein Fehler in einer frühen Version des lsBefehls . Der Autor wollte .und ..von der Auflistung ausschließen, schloss jedoch versehentlich alle Dateien aus, die mit beginnen .. Dadurch wurden Punktedateien ausgeblendet ls. Shells folgten, indem sie Punktedateien wie versteckten ls. Dies war jedoch wieder ein Hack: Dateien, die mit beginnen, .werden nur dann ausgeschlossen, wenn der Punkt im Muster nicht explizit übereinstimmt. Das Muster .*enthält also .und ...

Um die Kompatibilität mit vorhandenen Skripten zu gewährleisten, enthalten moderne Shells weiterhin .und ..(mit Ausnahme von zsh, das in dieser Angelegenheit wie viele andere ein vernünftigeres, aber nicht abwärtskompatibles Verhalten aufweist). Wenn Sie jedoch festlegen GLOBIGNORE, verwenden Sie eine bash-spezifische Funktion, die anzeigt, dass Sie nicht an der Abwärtskompatibilität interessiert sind. So werden Mustervergleichsänderungen ausgeschlossen .und ..von allen Musterübereinstimmungen ausgeschlossen.

Einstellen GLOBIGNORE=.umfasst nicht eine Datei , die automatisch immer dann , wenn ohnehin ausgeschlossen ist , GLOBIGNOREgesetzt ist, so ist es gleichwertig ist , shopt -s dotglobdaß ausnehmen .und ..sind weiterhin von allen Mustern ausgeschlossen.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Eigentlich habe ich gerade gemerkt, dass die Einstellung GLOBIGNOREnur ignorieren .und ..in Schrägstrichen ohne Muster und GLOBIGNORE Dateipfade filtert, keine Dateinamen. GLOBIGNORE=.; echo .*wird nicht enthalten .noch .., aber GLOBIGNORE=.; echo ./.*(oder echo /bin/.*) wird! Um zu ignorieren .und ..von allen Globs, sieht es so aus, als ob Sie shopt -s extglobund brauchen GLOBIGNORE='?(*/)@(.|..)'.
Stéphane Chazelas
1
Eigentlich nein, GLOBIGNORE='?(*/)@(.|..)'würde nicht ausschließen .und ..in .*/foo. GLOBIGNORE='?(*/)@(.|..)?(/*)'würde Tropfen brechen wie ./*...
Stéphane Chazelas
3

Aus dem Abschnitt "Pfadnamenerweiterung" in man bash:

Die Dateinamen ''. '' Und '' .. '' werden immer ignoriert, wenn GLOBIGNORE gesetzt ist und nicht null.

John1024
quelle