Dans les composants de nom de chemin sous Unix, seuls deux caractères ne peuvent pas être utilisés: le caractère null, qui termine les chaînes en C (le langage du noyau) et la barre oblique, qui est réservée en tant que séparateur de chemin. De plus, les composants de chemin ne peuvent pas être des chaînes vides.
Ainsi, dans un nom de chemin, nous n'avons que deux types de jetons: une barre oblique et un composant.
Supposons que, sans ajouter de nouveaux jetons , nous souhaitons prendre en charge deux types de chemins, relatif et absolu. De plus, nous aimerions pouvoir faire référence au répertoire racine, qui n'a pas de nom (il n'a pas de parent qui lui donnerait un nom).
Comment pouvons-nous représenter des chemins relatifs, des chemins absolus et faire référence au répertoire racine en utilisant uniquement la barre oblique?
Le moyen le plus évident d'étendre un langage (autre que l'introduction d'un nouveau jeton) est de créer une nouvelle syntaxe: donnez un nouveau sens aux combinaisons de jetons qui sont une syntaxe non valide.
Les chemins qui commencent par une barre oblique n’ont pas de sens, alors pourquoi ne pas utiliser une barre oblique comme marqueur qui indique "ce chemin est absolu plutôt que relatif".
Un chemin qui ne contient rien d'autre qu'une barre oblique est également invalide, alors pourquoi ne pas lui attribuer le sens "le répertoire racine".
Ces deux significations sont liées car un chemin absolu commence à chercher dans le répertoire racine. En d'autres termes, une barre oblique peut être considérée comme ayant la signification suivante:
- accédez au répertoire racine et utilisez le caractère barre oblique.
- s'il y a plus de matière dans le chemin, traitez-le comme un chemin relatif, sinon vous avez terminé.
Ensuite, nous pourrions aussi bien insérer une barre oblique de fin, ce qui peut vouloir dire "ce chemin indique que le dernier composant de chemin est le nom d'un répertoire plutôt qu'un fichier normal ou tout autre type d'objet: cette barre oblique de fin indique ce répertoire de la même manière que la façon dont la barre oblique principale indique le répertoire racine. "
Avec toute la syntaxe ci-dessus, nous avons toujours une syntaxe avec une signification non attribuée: doubles barres obliques, triples barres obliques, etc.
Pourquoi ne pas simplement introduire un autre jeton et le faire différemment. C'est probablement parce que les concepteurs ont adopté des approches minimalistes en général. (Pourquoi l’ ed
éditeur n’affiche-t-il un a ?
lorsque vous faites quelque chose de mal?) Une langue de chemin avec seulement deux types de jeton (composant et barre oblique) est facile à mémoriser et à utiliser.
Une autre considération importante est que des manipulations faciles des chemins sont possibles en utilisant uniquement des représentations de chaîne. Par exemple, nous pouvons "re-root" les chemins absolus vers un nouveau répertoire parent assez facilement:
OLD_PATH=/old/path
NEW_HOME=/new/home
NEW_PATH="$NEW_HOME$OLD_PATH" /new/home/old/path
Cela ne fonctionnerait pas si nous indiquions des chemins absolus d'une autre manière, comme un signe de dollar fort ou autre:
OLD_PATH=^old/path # ^ means absolute path
NEW_HOME=^new/home
# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"
Ce type de codage est encore nécessaire dans certains cas lorsqu'il s'agit de chemins de style Unix, mais il en existe moins.
cd /home
équivalent d'uncd /home/
ajout/
à la fin du nom vide donne accès à ce répertoire.