Scrolle runter ...
Die Dateinamen .
und ..
werden immer ignoriert, wenn GLOBIGNORE
festgelegt 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 ls
Befehls . 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 , GLOBIGNORE
gesetzt ist, so ist es gleichwertig ist , shopt -s dotglob
daß ausnehmen .
und ..
sind weiterhin von allen Mustern ausgeschlossen.
GLOBIGNORE
nur ignorieren.
und..
in Schrägstrichen ohne Muster und GLOBIGNORE Dateipfade filtert, keine Dateinamen.GLOBIGNORE=.; echo .*
wird nicht enthalten.
noch..
, aberGLOBIGNORE=.; echo ./.*
(oderecho /bin/.*
) wird! Um zu ignorieren.
und..
von allen Globs, sieht es so aus, als ob Sieshopt -s extglob
und brauchenGLOBIGNORE='?(*/)@(.|..)'
.GLOBIGNORE='?(*/)@(.|..)'
würde nicht ausschließen.
und..
in.*/foo
.GLOBIGNORE='?(*/)@(.|..)?(/*)'
würde Tropfen brechen wie./*
...Aus dem Abschnitt "Pfadnamenerweiterung" in
man bash
:quelle