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

8

Ist das Verhalten .*zu schließen .und ..definiert in LSB oder POSIX oder einer anderen Spezifikation?

Lesmana
quelle

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.

Gilles 'SO - hör auf böse zu sein'
quelle
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.

lcipriani
quelle
0

Die Linux-Manpage verweist auf POSIX.2, 3.13.

maxschlepzig
quelle
Hat das LSB erfordern man, man globoder die man-pages anwesend zu sein? Ich konnte hier keinen Mann finden (zu meiner Überraschung).
Ciro Santilli 法轮功 病毒 审查 六四 事件 26
0

Soweit ich das beurteilen kann, benötigt das LSB 4.1 nicht bashund nur sh.

Denn sh es folgt POSIX (mit einer kleinen nicht relevanten Erweiterung).

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
quelle