Comprendre les traversées de liens symboliques de répertoire et le répertoire parent

9

Disons que vous avez des répertoires /dir1et /dir2/linked, où ce dernier est un lien symbolique vers le premier.

Lorsque vous accédez cdà linkedet pwd, vous obtenez la sortie /dir2/linked. Si vous alorscd .. , vous serez mis /dir2. Ce comportement est cohérent avec le concept que vous étiez /dir2/linkedavant. Cependant, si je comprends bien, le répertoire parent ( ..) de tout répertoire est stocké dans le répertoire inode (c'est-à-dire: physiquement sur le disque). De toute évidence, puisque /dir2/linkedc'est vraiment /dir1, le répertoire parent sur l'inode doit être/

Pour compliquer encore les choses, à l’intérieur /dir2/linked, les sorties ls ..etcd .. ; ls . sont différentes! Il semble cdhonorer le chemin du lien symbolique, tout en honorant le chemin ls"physique". Comme mentionné dans cette question , il y a cependant cd -Pce cas d'utilisation.

man pwd mentionne les répertoires de travail "physiques" et "logiques", mais j'ai encore quelques questions à ce stade:

  • Ce comportement est-il toujours fourni par la PWDvariable d'environnement, comme mentionné dans man pwd?
  • Pourquoi faire par défaut cdet lsavoir des comportements différents, si ce sont deux commandes shell (c'est-à-dire: pas des programmes)?
  • Le programme typique (pas la commande shell) utilise-t-il à la PWDplace du chemin physique? Je me rends compte que c'est à la mise en œuvre, mais y a-t-il une règle d'or?
goncalopp
la source
1
Beaucoup d'informations dans cette réponse
Stéphane Chazelas
1
@ StéphaneChazelas C'est une réponse fantastique, merci pour le partage
goncalopp
Je vous en prie. N'hésitez pas à copier-coller du texte à partir de là si vous prévoyez de faire votre propre réponse à votre propre question.
Stéphane Chazelas

Réponses:

5

bash "connaît" les liens symboliques et suit ces informations lorsque vous utilisez un lien symbolique pour entrer dans un répertoire.

Vous pouvez vérifier cela en procédant comme suit dans votre exemple:

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1

Vous devez commencer le bash avec un vide PWD variable , sinon il utilise cette astuce pour afficher le "faux" chemin.

Notez qu'il ls s'agit d' un programme distinct et que, en tant que tel, il n'a pas la connaissance de bash sur la façon dont vous êtes arrivé dans le répertoire en cours, il vous ls ..suffit donc d'afficher le contenu du véritable répertoire parent, sans rapport avec le lien symbolique que vous avez suivi.

La plupart des programmes ne dépendront pas de la variable d'environnement CWDcar il existe de nombreuses façons de démarrer des programmes, via le shell bash en est un, il n'est donc pas fiable de s'attendre CWDà contenir la valeur correcte (essayez de définir CWDquelque chose de mal avant de le faire bash -c pwd, vous pouvez le voir vérifier la valeur pour la raison).

Wurtel
la source
il est utile de savoir que vous effacez PWDainsi, mais en soi cela ne répond pas aux questions que j'ai mentionnées
goncalopp
Ajout d'informations supplémentaires.
wurtel
J'étais sous l'impression a lsété fournie par bash, mais vous et helpm'a convaincu du contraire. Cela rend les choses beaucoup plus claires, merci!
goncalopp
PWDest standard dans POSIX. Vous pouvez vous y fier pour être réglé. S'il n'est pas défini, les choses pourraient se casser, par exemple l' pwd utilitaire : Voir aussi Variables d'environnement .
darkfeline