Il est probable que vous utilisiez déjà sans le savoir des caractères d'englobement. Quand vous enregistrez un fichier dans une application sous Windows ou lorsque vous recherchez un fichier, vous utilisez * pour désigner une suite de caractères quelconques. Par exemple, *.txt désigne l'ensemble des fichiers dont le nom se termine par .txt. Nous l'avons également utilisé fréquemment dans la section précédente, mais l'englobement va beaucoup plus loin que le seul *.
Quand vous tapez une commande comme ls *.txt, puis Entrée, la tâche de trouver quels fichiers correspondent au motif *.txt n'est pas du ressort de ls, mais doit passer par le shell lui-même. Cela requiert donc une petite explication sur la façon dont le shell interprète une ligne de commande. Lorsque vous tapez :
$ ls *.txt readme.txt recipes.txt |
La ligne de commande est tout d'abord séparée en mots (ls et *.txt en l'occurrence). Quand le shell voit le * dans un des mots, il interprète le mot comme étant un motif englobant et le remplace dans la ligne de commande par les noms de tous les fichiers correspondant au motif. Avant que ne s'exécute la ligne de commande dans le shell, ce dernier aura remplacé l'astérisque (*) par readme.txt et recettes.txt ; la commande deviendra donc ls readme.txt recettes.txt, ce qui donnera le résultat recherché. Le shell réagit aussi à la vue d'autres caractères :
[...] : correspond à tout caractère écrit entre les crochets ; les caractères peuvent désigner soit des intervalles (par exemple, 1-9), soit des valeurs discrètes, soit encore un mélange des deux. Exemple : [a-zBE5-7] correspond à tous les caractères de a à z, un B, un E, un 5, un 6 ou un 7 ;
[^...] : correspond à tous les caractères qui ne se trouvent pas entre les crochets ; [^a-z], par exemple, correspond à tout caractère qui n'est pas une lettre minuscule[6].
{c1,c2} : correspond à c1 ou c2, où c1 et c2 sont également des caractères d'englobement, ce qui signifie que vous pouvez écrire {[0-9]*,[acr]} par exemple.
Voici quelques exemples de motifs et leur signification :
/etc/*conf : tous les fichiers du répertoire /etc dont le nom se termine par conf. Cela peut correspondre au fichier /etc/inetd.conf, mais aussi à /etc/conf.linuxconf, et à /etc/conf si un tel fichier existe. Souvenez-vous que * peut correspondre à une chaîne vide.
image/{cars,space[0-9]}/*.jpg : tous les fichiers dont le nom se termine par .jpg dans les répertoires image/cars, image/space0, jusqu'à image/space9, s'ils existent.
/usr/share/doc/*/README : tous les fichiers de nom README dans tous les sous-répertoires immédiats de /usr/share/doc. Cela correspondra à /usr/share/doc/mandrake/README par exemple, mais pas à /usr/share/doc/myprog/doc/README.
*[^a-z] : tous les fichiers du répertoire courant dont le nom ne finit pas par une lettre minuscule.
[6] Attention ! Bien que cela soit vrai pour la plupart des langues, il est possible que cela ne fonctionne pas pour votre langue locale. Cela dépend de l'ordre de tri (collating order). Pour certaines configurations de langage, [a-z] correspondra à a, A, b, B (...), Z. Et cela, sans parler du fait que certaines langues contiennent des caractères accentués...