Le comportement de. * Doit-il être inclus? et .. défini dans LSB ou POSIX ou une autre spécification?

8

Le comportement de .*doit-il être inclus .et ..défini dans LSB ou POSIX ou dans une autre spécification?

lesmana
la source

Réponses:

10

Citant la spécification Single Unix version 2, volume "Commands & Utilities", §2.13.3 :

Si un nom de fichier commence par un point ( .), le point doit être explicitement mis en correspondance en utilisant un point comme premier caractère du modèle ou immédiatement après un caractère barre oblique. (…) Il n'est pas spécifié si une période explicite dans une liste de correspondance d'expressions entre crochets, telle que [.abc]peut correspondre à une première période dans un nom de fichier.

Il n'y a aucune exception qui ferait que le deuxième point dans .., ou la chaîne vide après le seul point dans ., ne correspondrait pas au caractère générique dans .*. Par conséquent, la norme dit que cela .*correspond .et.. , aussi ennuyeux que cela puisse être.

Le passage ci-dessus décrit le comportement du shell ( shcommande). La section sur la globfonction de bibliothèque C fait référence à ce passage.

Le langage est exactement le même dans la version 3 , également connue sous le nom de POSIX: 2001 et IEEE 1003.1-2001, qui est ce que la plupart des systèmes actuels implémentent.

Dash, bash et ksh93 sont conformes à POSIX. Pdksh et zsh (même sous emulate sh) ne le font pas.

Dans ksh, vous pouvez faire .*sauter .et ..en définissant FIGNORE='.?(.)', mais cela a pour effet secondaire de faire *inclure des fichiers dot. Ou vous pouvez définir FIGNORE='.*', mais .*cela ne correspond à rien.

En bash, vous pouvez faire .*sauter .et ..en définissant GLOBIGNORE='.:..', mais cela a pour effet secondaire de faire *inclure des fichiers à points. Ou vous pouvez définir GLOBIGNORE='.*', mais .*cela ne correspond à rien.

Gilles 'SO- arrête d'être méchant'
la source
remarque: bashn'est pas toujours conforme à POSIX. uniquement lorsqu'elle est invoquée en tant que sh.
strugee
4

Vous parlez probablement de la fonctionnalité dans l'expansion bash à propos de globignore. Par défaut, la correspondance d'expansion bash. et .. mais en lisant l'homme:

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.

Vous pouvez définir la variable de GLOBIGNORE=.:..sorte que lorsque vous tapez quelque chose comme ceci:

rm -r * .*

vous supprimez uniquement le répertoire en cours. La norme POSIX spécifie uniquement cela. est le répertoire courant et .. dans le parent du répertoire courant. La signification particulière de. * Est interprétée par bash ou d'autres shells (ou des programmes comme grep).

lcipriani
la source
0

La page de manuel Linux fait référence à POSIX.2, 3.13.

maxschlepzig
la source
Est -ce que le besoin LSB man, man globou l'homme-pages à présent? Je n'ai pas pu trouver d'homme ici (à ma grande surprise).
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
0

Pour autant que je sache, le LSB 4.1 ne nécessite pas bashet seulement sh.

Car sh il suit POSIX (avec une extension mineure non pertinente).

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