Réponses:
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 ( sh
commande). La section sur la glob
fonction 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.
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).
La page de manuel Linux fait référence à POSIX.2, 3.13.
man
, man glob
ou l'homme-pages à présent? Je n'ai pas pu trouver d'homme ici (à ma grande surprise).
Pour autant que je sache, le LSB 4.1 ne nécessite pas bash
et seulement sh
.
Car sh
il suit POSIX (avec une extension mineure non pertinente).
bash
n'est pas toujours conforme à POSIX. uniquement lorsqu'elle est invoquée en tant quesh
.