GLOB
Section: Manuel de l'administrateur Linux (7) Updated: 25 juillet 2003 Index
NOM
DESCRIPTION
MOTIFS GÉNÉRIQUES
Classes de caractères
Intervalles
Négation
CHEMINS D'ACCÈS
LISTES VIDES
NOTES
Expressions régulières
Internationalisation et classes de caractères.
VOIR AUSSI
TRADUCTION
NOM
glob - Développement des noms de fichiers.
DESCRIPTION
Il y a bien longtemps, dans Unix V6, existait un programme nommé
/etc/glob
qui permettait de développer les motifs génériques dans les noms de fichiers.
Ce programme devint bientôt une routine interne du shell.
De nos jours, on trouve également une routine de bibliothèque nommée
glob(3)
qui effectue le même travail en étant invoquée par un programme utilisateur.
Les règles de développement sont les suivantes (POSIX 1003.2, 3.13).
MOTIFS GÉNÉRIQUES
Une chaîne est un motif générique si elle contient un ou plusieurs
caractères parmi `?', `*' et `['. Le développement (globbing) est l'opération
qui transforme un motif générique en une liste de noms de fichiers
correspondant à ce motif.
La correspondance est définie ainsi :
Un `?' (sans les apostrophes) correspond à n'importe quel caractère.
A `*' (sans les apostrophes) correspond à n'importe quelle chaîne, y compris
la chaîne vide.
Classes de caractères
Une expression du type `[...]', dans laquelle le premier caractère après le `['
n'est pas un `!' est mise en correspondance avec un seul des caractères contenus
entre les crochets.
L'ensemble des caractères cités ne peut pas être vide, ainsi, le crochet fermant `]'
peut être présent dans l'ensemble, à la condition qu'il soit en première place.
Par conséquent, la chaîne `[][!]' peut être mise en correspondance avec l'un des
trois caractères `[', `]' et `!'.
Intervalles
Il existe une convention particulière, suivant laquelle deux caractères séparés par
un tiret `-' indiquent un intervalle.
Ainsi, `[A-Fa-f0-9]' équivaut à `[ABCDEFabcdef0123456789]'.
Pour inclure un tiret au sens littéral, il suffit de l'utiliser en premier ou en dernier
entre les crochets. `[]-]' correspond uniquement aux caractères `]' et `-',
alors que `[--/]' correspond aux trois caractères `-', `.', `/'.
Négation
Une expression `[!...]' correspond à n'importe quel caractère qui ne puisse pas être
mis en correspondance avec la chaîne obtenue en supprimant le `!' initial.
(ainsi, `[!]a-]' correspond à tout caractère sauf `]', `a' et `-'.)
On peut désactiver le comportement spécial des caractères `?', `*' et `[' en
les faisant précéder par un backslash '\', ou, dans le cas d'une ligne de commande
shell, en les encadrant par des guillemets.
Entre crochets, ces caractères ne prennent que leur signification littérale.
Ainsi, `[[?*\]' correspond aux quatre caractères `[', `?', `*' et `\'.
CHEMINS D'ACCÈS
Le développement est appliqué a chaque composant du chemin d'accès
séparément. Un `/' dans un chemin ne peut pas être mis en correspondance
avec un `?' ou `*', ni par un intervalle tel que `[.-0]'.
Un intervalle ne peut pas contenir explicitement un caractère `/'. Ceci
déclencherait une erreur de syntaxe.
Si un nom de fichier commence par un `.', Ce caractère doit être mis en
correspondance explicitement. (Ainsi, `rm *' ne supprimera pas .profile,
et `tar c *' n'archivera pas tous les fichiers ; `tar c .' serait préférable.)
LISTES VIDES
La définition simple et élégante fournie plus haut `transformer un motif générique
en une liste de noms de fichiers correspondants' est la définition Unix
originale. Elle autorisait la présence de motif se développant en listes
vides, comme
xv -wait 0 *.gif *.jpg
alors qu'il n'y a peut-être aucun fichier *.gif présent (et on ne
peut pas considérer cela comme une erreur).
Toutefois, POSIX réclame qu'un motif soit laissé inchangé s'il
est syntaxiquement incorrect, ou si la liste des noms de fichiers
correspondants est vide.
On peut forcer
bash
à adopter le comportement classique en positionnant la variable
d'environnement
allow_null_glob_expansion=true.
(Des problèmes similaires se produisent ailleurs. Par exemple de vieux scripts avec
rm `find . -name "*~"`
devraient être remplacés par des nouveaux scripts contenant
rm -f nosuchfile `find . -name "*~"`
pour éviter les messages d'erreurs si
rm
est invoqué avec une liste vide d'arguments).
NOTES
Expressions régulières
Notez que les motifs génériques ne sont pas des expressions
régulières bien qu'ils leur ressemblent. Tout d'abord, ils
correspondent à des noms de fichiers, et pas à du texte, de plus
les conventions ne sont pas identiques, par exemple, dans une
expression régulière, `*' signifie zéro ou plusieurs copies
de l'élément précédent.
Maintenant que les expressions régulières disposent de composants
entre crochets où la négation est indiquée par un `^', POSIX
a précisé que le motif générique `[^...]' a un effet indéfini.
Internationalisation et classes de caractères.
Bien entendu, les intervalles ont été créés à l'origine en tant
qu'intervalle ASCII où `[ -%]' signifie `[ !"#$%]' et `[a-z]' correspond
à "tout caractère minuscule".
Certaines implémentations Unix ont généralisé ceci de manière à ce que
l'intervalle X-Y correspondent à l'ensemble des caractères dont les
codes se trouvent entre ceux de X et de Y. Néanmoins, ceci signifie
que l'utilisateur doit connaître le codage utilisé sur le système local.
De plus ceci ne fonctionne pas si l'ordre de l'alphabet local n'est
pas celui adopté pour le codage des caractères.
POSIX a alors étendu grandement la notation des expressions entre crochets
autant pour les motifs génériques que pour les expressions régulières.
Nous avons vu précédemment 3 types d'éléments pouvant se trouver entre
crochets. Plus précisément (i) une négation, (ii) des caractères explicites,
et (iii) des intervalles. POSIX spécifie les intervalles d'une manière
plus utile au niveau international, et ajoute trois nouveaux types :
(iii) Les intervalles X-Y comprenant tous les caractères se trouvant entre X
et Y (inclus) dans l'ordre de l'alphabet décrit par la catégorie LC_COLLATE de
la localisation en cours.
(iv) Des classes de caractères comme
[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
ainsi, on peut écrire `[[:lower:]]' à la place de `[a-z]', et que le
comportement soit aussi valide au Danemark, où il existe 3 lettres
postérieures au `z'.
Ces classes de caractères sont définies par la catégorie LC_CTYPE
de la localisation en cours.
(v) Les symboles groupant plusieurs lettres comme `[.ch.]' ou `[.a-acute.]',
dans lesquels les chaînes entre `[.' et `.]' sont un élément défini dans
la localisation en cours. Il peut également s'agir de multi-caractères.
(vi) Des classes d'équivalence comme `[=a=]', où la chaîne entre `[=' et `=]'
est un élément définissant une classe d'équivalence dans la localisation en cours
par exemple `[[=a=]]' peut être équivalent à `[aáàäâ]' (Latin-1), c'est à dire
`[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]'.
VOIR AUSSI
TRADUCTION
Christophe Blaess, 1998-2003.
|