Ist das Verhalten von. * Zu berücksichtigen. und .. in LSB oder POSIX oder einer anderen Spezifikation definiert?


Antworten:


10

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 ( shBefehl). Der Abschnitt über die globC-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.


Hinweis: bashEntspricht nicht immer POSIX. nur wenn es als aufgerufen wird sh.
strugee

4

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.



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.