Antworten:
Zitat aus der Single Unix-Spezifikation Version 2, Band "Commands & Utilities", §2.13.3 :
Wenn ein Dateiname mit einem Punkt (
.
) beginnt, muss der Punkt explizit abgeglichen werden, indem ein Punkt als erstes Zeichen des Musters verwendet wird oder unmittelbar auf einen Schrägstrich folgt. (…) Es ist nicht angegeben, ob ein expliziter Punkt in einer Übereinstimmungsliste für Klammerausdrücke[.abc]
mit einem führenden Punkt in einem Dateinamen übereinstimmen kann.
Es gibt keine Ausnahme, bei der der zweite Punkt in ..
oder die leere Zeichenfolge nach dem einzigen Punkt in .
nicht mit dem Platzhalter in übereinstimmt .*
. Daher sagt der Standard, dass es .*
passt .
und..
, obwohl es ärgerlich sein mag.
Die obige Passage beschreibt das Verhalten der Shell ( sh
Befehl). Der Abschnitt über die glob
C-Bibliotheksfunktion verweist auf diese Passage.
Die Sprache ist in Version 3 , auch bekannt als POSIX: 2001 und IEEE 1003.1-2001, genau dieselbe , was die meisten aktuellen Systeme implementieren.
Dash, bash und ksh93 entsprechen POSIX. Pdksh und zsh (auch unter emulate sh
) nicht.
In ksh können Sie .*
überspringen .
und ..
festlegen FIGNORE='.?(.)'
, dies hat jedoch den Nebeneffekt, dass *
Include-Punktdateien erstellt werden. Oder Sie können einstellen FIGNORE='.*'
, .*
passt dann aber zu nichts.
In Bash können Sie .*
überspringen .
und ..
festlegen GLOBIGNORE='.:..'
, dies hat jedoch den Nebeneffekt, dass *
Include-Punktdateien erstellt werden. Oder Sie können einstellen GLOBIGNORE='.*'
, .*
passt dann aber zu nichts.
Wahrscheinlich meinen Sie die Funktionalität bei der Bash-Erweiterung über Globignore. Standardmäßig stimmt die Bash-Erweiterung überein. und .. aber den Mann lesen:
The GLOBIGNORE shell variable may be used to restrict the set of file names matching
a pattern. If GLOBIGNORE is set, each matching file name that also matches one of
the patterns in GLOBIGNORE is removed from the list of matches. The file names ``.''
and ``..'' are always ignored when GLOBIGNORE is set and not null. However, setting
GLOBIGNORE to a non-null value has the effect of enabling the dotglob shell option,
so all other file names beginning with a ``.'' will match. To get the old behavior
of ignoring file names beginning with a ``.'', make ``.*'' one of the patterns in
GLOBIGNORE. The dotglob option is disabled when GLOBIGNORE is unset.
Sie können die Variable GLOBIGNORE=.:..
so einstellen, dass Sie Folgendes eingeben:
rm -r * .*
Sie entfernen nur das aktuelle Verzeichnis. Der POSIX-Standard legt dies nur fest. ist das aktuelle Verzeichnis und .. im übergeordneten Verzeichnis des aktuellen Verzeichnisses. Die spezielle Bedeutung von. * Wird von Bash oder anderen Shells (oder Programmen wie grep) interpretiert.
Die Linux-Manpage verweist auf POSIX.2, 3.13.
man
, man glob
oder die man-pages anwesend zu sein? Ich konnte hier keinen Mann finden (zu meiner Überraschung).
Soweit ich das beurteilen kann, benötigt das LSB 4.1 nicht bash
und nur sh
.
Denn sh
es folgt POSIX (mit einer kleinen nicht relevanten Erweiterung).
bash
Entspricht nicht immer POSIX. nur wenn es als aufgerufen wirdsh
.