5.5. Notions de chemins sous Unix

Les chemins Unix permettent de qualifier complètement un répertoire ou un fichier sur le disque. Pour cela, ils utilisent les noms de ces répertoires et de ces fichiers, et ils les combinent pour indiquer comment atteindre la cible dans le système de fichiers. Classiquement, les chemins sont spécifiés par la séquence des répertoires dans lesquels il faut aller pour trouver cette cible. Cette séquence est donnée par la suite des noms des répertoires, séparés par un caractère spécial. Sous Unix, ce caractère est la barre oblique (« / »). Le répertoire racine n'a pas de nom, et peut donc être référencé par une barre oblique seule.

Les chemins peuvent être absolus (c'est-à-dire qu'ils peuvent partir du répertoire racine) ou relatifs (c'est-à-dire qu'il peuvent partir du répertoire courant). Si l'on utilise un chemin relatif, il faut savoir que le répertoire courant est désigné par un point (« . »), et que le répertoire parent du répertoire courant est désigné par deux points successifs (« .. »). Ainsi, si l'on est dans le répertoire /usr/local/bin, on peut accéder au répertoire /usr/X11/bin avec les deux chemins suivants :

/usr/X11/bin

ou :

../../X11/bin

Le premier chemin est absolu, parce qu'il part directement du répertoire racine. Le deuxième chemin est relatif, car il part du répertoire courant.

Note : Il va de soi que les chemins relatifs ne sont valides, sauf coup de chance, que dans le répertoire dans lequel ils sont écrits, alors que les chemins absolus sont toujours valables. En revanche, si des répertoires sont déplacés ensemble, les chemins relatifs entre ces répertoires restent valides, mais les chemins absolus deviennent faux. Toutefois, ces considérations ne concernent pas un utilisateur de base.

La plupart des shells sont capables d'effectuer ce que l'on appelle la complétion automatique des commandes. La complétion automatique permet de n'écrire qu'une partie des noms de fichiers ou de répertoires et de demander au shell de compléter ces noms. Cela peut se faire de deux manières. La première solution, qui est aussi la plus simple, consiste à taper le début du nom, puis d'utiliser une touche spéciale qui permet de demander au shell de le compléter. Si vous utilisez le shell bash (bash est le shell de prédilection sur les systèmes Linux), cette touche est la touche de tabulation. Ainsi, si vous tapez :

cd /ho

et que vous appuyez sur la touche de tabulation, bash complétera cette ligne de la manière suivante :

cd /home/

Pour cela, il regarde la liste des fichiers et des répertoires qui commencent par « ho » dans le répertoire racine. Normalement, il ne s'y trouve que le répertoire /home/, et c'est ce nom que bash utilise. Il va de soi qu'il ne faut pas qu'il y ait ambiguïté sur un nom partiel. Par exemple, si vous tapez la commande suivante :

cd /usr/l

et que vous demandiez au shell de compléter le nom, il ne pourra pas choisir quel répertoire utiliser entre /usr/lib/ et /usr/local/. Dans ce cas, il émettra un petit bip signalant l'erreur. En appuyant une fois de plus sur la touche de tabulation, bash affiche la liste des choix possibles et vous propose de terminer la ligne de commande en saisissant des caractères supplémentaires afin de résoudre l'ambiguïté.

La deuxième solution est d'utiliser les caractères génériques du shell. Ces caractères permettent de désigner n'importe quel caractère, ou n'importe quelle séquence de caractères. Ils sont désignés respectivement par un point d'interrogation (« ? ») et par un astérisque (« * »). Ainsi, si l'on tape la commande suivante :

cd /ho*

le shell ira directement dans le répertoire /home/, car le caractère générique « * » peut être remplacé par la séquence de caractères « me ». Il est également possible d'écrire :

cd /?ome

et dans ce cas le caractère générique « ? » sera remplacé par « h ». Encore une fois, il ne faut pas qu'il y ait ambiguïté. Dans le cas contraire, le comportement varie selon le shell. En général, il essaie de résoudre l'ambiguïté au mieux en analysant la suite du chemin, et s'il ne peut pas, il affiche un message d'erreur.

Note : Ces caractères génériques sont interprétés directement par le shell et non par la commande qui les reçoit en paramètres. Tout nom de fichier contenant un caractère générique est remplacé par la liste des fichiers qui correspondent au motif donné. S'il n'existe qu'un seul fichier dans cette liste, il est possible d'utiliser les commandes comme cd, qui ne prennent qu'un seul paramètre. Mais il est possible d'utiliser les commandes acceptant plusieurs paramètres, même s'il y a plusieurs fichiers dans cette liste. Ainsi, la commande suivante :

ls *txt

permet de lister tous les fichiers dont le nom se termine par « txt ». Il ne peut évidement pas y avoir d'ambiguïté dans ce cas.

Si on doit passer un paramètre comprenant l'un des caractères génériques interprétés par le shell à une commande particulière, on devra préfixer les caractères génériques d'un caractère d'échappement pour signaler au shell qu'il ne doit pas l'interpréter. Ce caractère d'échappement est la barre oblique inverse (« \ »). Il est également possible de passer les paramètres entre guillements « " », car le shell n'interprète pas les caractères génériques dans les chaînes de caractères. Par exemple, pour créer un répertoire ?, on utilisera la commande suivante :

mkdir \?