2012-05-04 12 views
24

Angenommen, ich habe die Ordner ~/a/b in meinem Home-Ordner und der Ordner b enthält einen symbolischen Link auf '..' namens 'Symlink'. Dann führe ich die folgenden Aktionen in bash:Verhalten von cd/bash auf symbolische Links

[email protected]:~$ cd a/b/symlink 
[email protected]:~/a/b/symlink$ pwd -P 
/home/hm/a 
[email protected]:~/a/b/symlink$ cd .. 
[email protected]:~/a/b$ pwd -P 
/home/hm/a/b 

PWD -P druckt das aktuelle Arbeitsverzeichnis, dereferencing alle symbolischen Links. Warum ist das Arbeitsverzeichnis/home/hm/a/b am Ende, und nicht/home/hm?

Antwort

26

bash wird "freundlich"; wenn Sie cd /into/a/symlink/, erinnert sich die Shell den alten Standort (in $OLDPWD) und dass Verzeichnis verwenden, wenn Sie cd .. unter der Annahme, dass Sie in das Verzeichnis zurückkehren möchten Sie waren gerade in.

Wenn Sie die verwenden möchten -o physical` verwenden

  The -P option says to use the physical directory 
      structure instead of following symbolic links (see 
      also the -P option to the set builtin command); 
      the -L option forces symbolic links to be followed. 
$ cd 
$ cd a/b/symlink 
$ cd -P .. 
$ pwd -P 
/home/sarnold 
$ 
+8

FYI, können Sie 'gesetzt oder' set -P' dieses Verhalten dauerhaft zu machen: echte.., muss auch cd -P verwenden Sie dann. – Kevin

+1

.. Ich sollte erwähnen, dass die Implementierung ist wahrscheinlich mehr im Einklang mit @ Geekosaur Beschreibung; Ich würde nicht erwarten, dass das Überschreiben von 'OLDPWD' mit Ihrem eigenen Wert das' cd ..' Verhalten beeinflussen würde. – sarnold

+0

Ich stimme zu, dass OLDPWD hier eigentlich gar nichts macht. Ich testete es, indem ich eine Symlink-Kette drei Ebenen tief hinunterging und dann einige Male "cd .." machte. Es hat gut funktioniert. Wenn OLDPWD verwendet wurde, würde es nicht funktionieren. OLDPWD merkt sich nur ein Verzeichnis und konnte nicht verwendet werden, um mehr als ein Verzeichnis zurückzugehen. Daher wird OLDPWD nicht verwendet. –

4

bash verfolgt den logischen aktuellen Verzeichnispfad, wie in Ihrer Eingabeaufforderung angezeigt, und interpretiert Dinge wie cd .. entsprechend. Dies macht die Dinge ein wenig konsistenter, wenn Sie nur solche Pfade in cd (oder pushd) verwenden, auf Kosten unerwarteter Dinge, wenn Sie dann erwarten, dass dasselbe mit Pfaden in Befehlsargumenten (oder innerhalb von Befehlen; emacs und vim) geschieht ihre eigenen konfigurierbaren Regeln für die Symlink-Behandlung, aber die meisten Befehle sind auf den Kernel angewiesen, um damit umzugehen).

Verwandte Themen