Le comportement de .*
doit-il être inclus .
et ..
défini dans LSB ou POSIX ou dans une autre spécification?
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.
bash
n'est pas toujours conforme à POSIX. uniquement lorsqu'elle est invoquée en tant quesh
.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:
Vous pouvez définir la variable de
GLOBIGNORE=.:..
sorte que lorsque vous tapez quelque chose comme ceci: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 source
La page de manuel Linux fait référence à POSIX.2, 3.13.
la source
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 seulementsh
.Car
sh
il suit POSIX (avec une extension mineure non pertinente).la source