Qu'est-ce que dot dot (..)? Pourquoi son comportement est-il différent avec les liens symboliques?

15

J'essaie de comprendre la nature de ..(double point). Il semble pointer vers des cibles différentes selon la façon dont vous y accédez.

Exemple:-

    /outer/
        middle/
            inner/
        inner --> ./middle/inner/

Maintenant, /outer/middle/inner/..mène à /outer/middle/, mais si j'y accède via le lien symbolique, /outer/inner/..mène à /outer/. Il semble qu'il y en ait deux différents ..ici.

C'est quoi ..exactement? lien symbolique? lien dur? Ou est-il généré dynamiquement en fonction du chemin d'accès au répertoire? Ou peut-être que ma compréhension des liens symboliques est fausse.

Éditer:

Autre observation connexe

    /outer/
        middle/
            file
            inner/
               f --> ./../file
        inner --> ./middle/inner/

Maintenant, si j'essaie d'accéder au fichier à travers /outer/inner/fcela fonctionne. Mais cela ne devrait pas, car /outer/inner/../fileil ne pointe pas vers un fichier. le fichier est dedans /outer/middle/inner/... Cela semble contredire le comportement ci-dessus!?

user98456
la source
Notez que les liens symboliques ne sont pas des raccourcis; ce sont plutôt des pointeurs.
wizzwizz4

Réponses:

35

..est un lien dur vers le répertoire parent qui est créé dans le cadre de l'entrée de répertoire.

Si vous émettez ls -aildans chacun de ces répertoires, vous devriez voir que les entrées suivantes ont toutes le même inode(premier champ) et le nombre de liens matériels (troisième champ):

  • ..lors de l'exécution ls -aildansinner
  • .lors de l'exécution ls -aildansmiddle
  • middlelors de l'exécution ls -aildansouter

Maintenant, / extérieur / milieu / intérieur / .. mène à / extérieur / milieu /, mais si j'y accède par le lien symbolique, / extérieur / intérieur / .. mène à / extérieur /. Il semble qu'il y en ait deux différents .. ici.

Il y a une ..entrée inner. Si votre répertoire de travail actuel est outer, vous devriez voir les mêmes résultats (une liste de répertoires middle) de

  • ls -al inner/..
  • ls -al middle/inner/..

La seule situation dans laquelle « l' accès » ..via le lien symbolique devrait fournir un comportement différent est si vous cden innerutilisant le lien symbolique, afin que votre logique répertoire de travail ( pwd -L) diffère de votre physique répertoire de travail ( pwd -P). Dans ce cas, cd ..vous reviendrez outer non pas parce qu'il existe une ..entrée différente , mais parce que votre shell garde une trace de votre répertoire de travail logique et vous fait sortir d'un niveau, plutôt que de référencer l' ..entrée réelle dans inner.

Il s'agit d'une commodité fournie par exemple bashdans le cadre de la cdcommande intégrée . Vous pouvez remplacer cela en lui demandant de passer à l' ..entrée réelle avec

cd -P ..

-Pdemande cd(comme pwdci-dessus) d'utiliser le chemin physique.

user4556274
la source
Aha, la confusion vient de l'utilisation cdde vérifier. Donc, corrigez-moi si je me trompe, ..pointe toujours vers le parent physique, si un lien symbolique l'utilise, ..il sera dirigé vers le parent (physique) réel. La confusion ne se produit cdque dans les répertoires.
user98456
Ceci explique également le comportement des secondes. Merci beaucoup.
user98456
3
@Theophrastus, ls -laivous montre que /..c'est le répertoire racine lui-même, à nouveau (aka /. ou /). Sauf si le système de fichiers est cassé, il ne devrait y avoir aucun autre cas où . == ..; même quand un fs est monté quelque part, il obtient le bon ..parent (temporaire) (donc il y a de la magie là-dedans, ce ..n'est pas seulement une simple entrée statique dans la table du système de fichiers).
AnoE