Grundlegendes zu Verzeichnissymlinks und dem übergeordneten Verzeichnis

9

Angenommen, Sie haben Verzeichnisse /dir1und /dir2/linked, wobei letzteres ein Symlink zu ersteren ist.

Wenn Sie cdzu linkedund pwd, erhalten Sie die Ausgabe /dir2/linked. Wenn Sie dann cd .., werden Sie angezogen /dir2. Dieses Verhalten steht im Einklang mit dem Konzept, dass Sie sich /dir2/linkedzuvor befinden. Soweit ich weiß, wird das übergeordnete Verzeichnis ( ..) eines Verzeichnisses im Verzeichnis inode gespeichert (dh physisch auf der Festplatte). Da dies /dir2/linkedwirklich /dir1der Fall ist , muss das übergeordnete Verzeichnis auf dem Inode offensichtlich sein/

Um die Sache weiter zu verkomplizieren, /dir2/linkedsind die Ausgänge von ls ..und cd .. ; ls .im Inneren unterschiedlich! Es scheint, als würde cdder symlinked Pfad geehrt, während lsder "physische" Pfad gewürdigt wird. Wie in dieser Frage erwähnt , gibt es cd -Pfür diesen Anwendungsfall jedoch.

man pwd erwähnt "physische" und "logische" Arbeitsverzeichnisse, aber ich habe an dieser Stelle noch einige Fragen:

  • Wird dieses Verhalten immer von der PWDUmgebungsvariablen bereitgestellt , wie in erwähnt man pwd?
  • Warum standardmäßig cdund lsunterschiedlich verhalten, wenn beide Shell-Befehle sind (dh keine Programme)?
  • Verwendet das typische Programm (kein Shell-Befehl) PWDanstelle des physischen Pfads? Mir ist klar, dass es an der Implementierung liegt, aber gibt es eine Faustregel?
Goncalopp
quelle
1
Viele Informationen in dieser Antwort
Stéphane Chazelas
1
@ StéphaneChazelas Das ist eine fantastische Antwort, danke für das Teilen
Goncalopp
Bitte. Bitte zögern Sie nicht, Text von dort zu kopieren und einzufügen, wenn Sie vorhaben, Ihre eigene Frage selbst zu beantworten.
Stéphane Chazelas

Antworten:

5

bash "kennt" Symlinks und verfolgt diese Informationen, wenn Sie einen Symlink verwenden, um ein Verzeichnis einzugeben.

Sie können dies überprüfen, indem Sie in Ihrem Beispiel Folgendes tun:

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

Sie müssen die Bash mit einer leeren PWDVariablen starten , andernfalls wird dieser Trick verwendet, um den "falschen" Pfad anzuzeigen.

Beachten Sie, dass ls es sich um ein separates Programm handelt und dass Bash nicht weiß, wie Sie zum aktuellen Verzeichnis gekommen sind. Es ls ..wird also nur der Inhalt des realen übergeordneten Verzeichnisses angezeigt, nicht relativ zu dem Symlink, dem Sie gefolgt sind.

Die meisten Programme hängen nicht von der Umgebungsvariablen ab, CWDda es viele Möglichkeiten gibt, Programme zu starten. Über die Bash-Shell gibt es nur eine. Daher ist es nicht zuverlässig, CWDden richtigen Wert zu erwarten (versuchen Sie CWD, vor dem Ausführen auf etwas Falsches zu setzen bash -c pwd, sehen Sie, dass dies überprüft wird der Wert für geistige Gesundheit).

wurtel
quelle
Es ist nützlich zu wissen, dass Sie so klar PWDsind, aber allein beantwortet dies nicht die Fragen, die ich erwähnt habe
Goncalopp
Weitere Infos hinzugefügt.
Wurtel
Ich hatte den Eindruck ls, von Bash vermittelt worden zu sein, aber Sie und helpüberzeugten mich anders. Das macht die Dinge viel klarer, danke!
Goncalopp
PWDist Standard in POSIX. Sie können sich darauf verlassen, dass es eingestellt wird. Wenn es nicht festgelegt ist, können Probleme auftreten, z. B. das pwd Dienstprogramm : Siehe auch Umgebungsvariablen .
Darkfeline