Angenommen, Sie haben Verzeichnisse /dir1
und /dir2/linked
, wobei letzteres ein Symlink zu ersteren ist.
Wenn Sie cd
zu linked
und 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/linked
zuvor befinden. Soweit ich weiß, wird das übergeordnete Verzeichnis ( ..
) eines Verzeichnisses im Verzeichnis inode gespeichert (dh physisch auf der Festplatte). Da dies /dir2/linked
wirklich /dir1
der Fall ist , muss das übergeordnete Verzeichnis auf dem Inode offensichtlich sein/
Um die Sache weiter zu verkomplizieren, /dir2/linked
sind die Ausgänge von ls ..
und cd .. ; ls .
im Inneren unterschiedlich! Es scheint, als würde cd
der symlinked Pfad geehrt, während ls
der "physische" Pfad gewürdigt wird. Wie in dieser Frage erwähnt , gibt es cd -P
fü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
PWD
Umgebungsvariablen bereitgestellt , wie in erwähntman pwd
? - Warum standardmäßig
cd
undls
unterschiedlich verhalten, wenn beide Shell-Befehle sind (dh keine Programme)? - Verwendet das typische Programm (kein Shell-Befehl)
PWD
anstelle des physischen Pfads? Mir ist klar, dass es an der Implementierung liegt, aber gibt es eine Faustregel?
quelle
Antworten:
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:
Sie müssen die Bash mit einer leeren
PWD
Variablen 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. Esls ..
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,
CWD
da es viele Möglichkeiten gibt, Programme zu starten. Über die Bash-Shell gibt es nur eine. Daher ist es nicht zuverlässig,CWD
den richtigen Wert zu erwarten (versuchen SieCWD
, vor dem Ausführen auf etwas Falsches zu setzenbash -c pwd
, sehen Sie, dass dies überprüft wird der Wert für geistige Gesundheit).quelle
PWD
sind, aber allein beantwortet dies nicht die Fragen, die ich erwähnt habels
, von Bash vermittelt worden zu sein, aber Sie undhelp
überzeugten mich anders. Das macht die Dinge viel klarer, danke!PWD
ist Standard in POSIX. Sie können sich darauf verlassen, dass es eingestellt wird. Wenn es nicht festgelegt ist, können Probleme auftreten, z. B. daspwd
Dienstprogramm : Siehe auch Umgebungsvariablen .