J'ai fait des recherches à ce sujet sur Google, mais les résultats étaient nuageux. Pourquoi est-ce que /
signe utilisé pour désigner le répertoire racine. Y a-t-il des raisons solides derrière cela?
La barre oblique /
est le caractère de délimitation qui sépare les répertoires dans chemins dans les systèmes d'exploitation de type Unix. Ce personnage semble avoir été choisi dans les années 1970, et selon sources anecdotiques , les raisons pourraient être liées au fait que le prédécesseur d'Unix, le système d'exploitation Multics , utilisé le >
caractère comme séparateur de chemin, mais les concepteurs d'Unix avaient déjà réservé les caractères >
et <
pour signifier la redirection d'E/S sur la ligne de commande Shell bien avant qu'ils aient un système de fichiers à plusieurs niveaux. Donc, quand le moment est venu de concevoir le système de fichiers, ils ont dû trouver un autre caractère pour signifier la séparation des éléments de nom de chemin.
Une chose à noter ici est que dans le terminal Lear-Siegler ADM-3A en usage courant au cours des années 1970, dont entre autres choses la pratique d'utiliser le ~
le caractère pour représenter le répertoire personnel provient , le / la clé est à côté de la > clé:
Quant à savoir pourquoi le répertoire racine est désigné par un seul /
, il s'agit d'une convention très probablement influencée par le fait que le répertoire racine est le répertoire de niveau supérieur de la hiérarchie des répertoires, et bien que d'autres répertoires puissent être en dessous, il n'y a généralement aucune raison de se référer à quoi que ce soit en dehors du répertoire racine. De même, l'entrée de répertoire elle-même n'a pas de nom, car c'est la limite de l'arborescence de répertoires visible.
Le premier système de fichiers hiérarchique tel que nous le connaissons aujourd'hui a été conçu pour Multics . La conception est décrite dans "A General-Purpose File System For Secondary Storage" par R.C. Daley et P.G. Neumann. Une caractéristique saillante de ce système de fichiers est qu'un répertoire est un fichier qui peut être contenu dans un répertoire comme tout autre fichier. La structure de fichiers forme un arbre, dans lequel tous les nœuds non-feuilles sont des répertoires. La racine de l'arbre est toujours un répertoire. Chaque fichier a un nom (le nom de l'entrée ) qui est unique dans son répertoire parent. Le répertoire racine n'a pas de nom car il n'est pas contenu dans un autre répertoire.
Pour désigner un fichier, vous devez décrire le chemin depuis la racine de l'arborescence. Les multics ont adopté une syntaxe naturelle pour noms de chemin où si P
est le chemin vers un répertoire et F
est le nom d'un fichier, puis P>F
est la syntaxe du fichier appelé F
dans le répertoire dont le chemin est P
.
Pour les moments où vous ne voulez pas vous encombrer de répertoires, Multics avait une notion de répertoire de travail . Un nom de fichier nu sans indication de répertoire est interprété comme un fichier dans le répertoire de travail.
En combinant ces règles, foo
est un fichier dans le répertoire de travail; foo>bar
est un fichier dans le répertoire enfant foo
du répertoire de travail, etc. Ces règles décrivent des chemins relatifs, mais une règle supplémentaire est nécessaire pour construire des chemins absolus à partir du répertoire racine. Étant donné que la lecture d'un nom de chemin de gauche à droite correspond au passage de la racine aux feuilles de l'arbre, la racine doit être indiquée par un marqueur spécial à gauche du nom du chemin. Étant donné que les noms de fichiers ne sont jamais vides (car cela serait souvent source de confusion), aucun nom de chemin relatif ne commence jamais par le caractère >
, ce qui en fait un marqueur pratique pour les noms de chemin absolus. Donc >foo
est le fichier appelé foo
dans le répertoire racine, >foo>bar
est le fichier appelé bar
dans le répertoire appelé foo
dans le répertoire racine, etc. Cela laisse le répertoire racine, qui pourrait être la chaîne vide; cependant, il n'est souvent pas pratique d'utiliser la chaîne vide comme nom de chemin, donc à la place, elle est écrite >
, ce qui présente l'avantage supplémentaire qu'un nom de chemin d'accès est absolu si et seulement si son premier caractère est >
.
Unix a adopté cette conception de Multics. Comme Unix avait déjà utilisé le caractère >
pour la redirection de sortie dans sa commande Shell, ses designers ont choisi un caractère différent /
pour séparer les répertoires des noms de chemin.
Dans les composants de nom de chemin sous Unix, seuls deux caractères ne peuvent pas être utilisés: le caractère nul, qui termine les chaînes en C (le langage du noyau) et la barre oblique, qui est réservée comme 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, relatifs et absolus. 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?
La façon la plus évidente d'étendre une langue (autre que l'introduction d'un nouveau jeton) est de créer une nouvelle syntaxe: donner un nouveau sens aux combinaisons de jetons qui ne sont pas une syntaxe valide.
Les chemins qui commencent par une barre oblique n'ont pas de sens, alors pourquoi ne pas utiliser une barre oblique de tête comme marqueur indiquant "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 la signification "le répertoire racine".
Ces deux significations sont liées car un chemin absolu commence la recherche dans le répertoire racine. En d'autres termes, une barre oblique peut être considérée comme ayant la signification suivante:
Ensuite, nous pourrions aussi bien ajouter une barre oblique de fin, ce qui peut signifier "ce chemin affirme 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 désigne ce répertoire de manière similaire à la façon dont la barre oblique principale désigne le répertoire racine. "
Avec toute cette syntaxe ci-dessus, nous avons toujours une syntaxe avec une signification non affecté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'éditeur ed
n'affiche-t-il qu'un ?
lorsque vous faites quelque chose de mal?) La barre oblique est facile à taper, ne nécessitant aucun décalage. Un langage de chemin avec seulement deux types de jetons (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înes. Par exemple, nous pouvons "re-rooter" des 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 les chemins absolus d'une autre manière, comme un signe dollar 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 toujours nécessaire dans certains cas lorsqu'il s'agit de chemins de style Unix, mais il y en a moins.