挙動

2012-05-04 7 views
24

は、私は私のホームフォルダ内のフォルダ〜/ A/Bを持っていると仮定し、フォルダBは へのシンボリックリンクが含まれている「..」 『のシンボリックリンク』という名前。それから私は bashで以下の操作を実行します。挙動

[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は、すべてのシンボリックリンクを逆参照、現在の作業ディレクトリを表示します。 /home/hm/a/bという作業ディレクトリは、/ home/hmではなく、最後にあるのはなぜですか?

答えて

26

bashは "優しい" ことです。あなたcd /into/a/symlink/、シェルは($OLDPWDに)古い場所を記憶したときに、あなたがちょうどにいたディレクトリに戻りたいという仮定の下であなたがcd ..そのディレクトリを使用しますとき。

あなたが使用したい場合本当..、そしてあなたもcd -Pを使用する必要があります。

  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、あなたが使用することができます '-o physical'を設定したり、'この動作が永続的に-P'を設定します。 – Kevin

+1

..実装はおそらく@ geekosaurの記述と一線を画しています。あなた自身の価値で 'OLDPWD'を上書きすることが実際に' cd ..'動作に影響するとは思いません。 – sarnold

+0

OLDPWDが実際に何もしないと私は同意します。シンボリックリンクを3段階深く "cd"してから、 "cd .."を数回試してみました。それは正常に働いた。 OLDPWDを使用した場合、動作しません。 OLDPWDは1つのディレクトリだけを記憶しており、複数のディレクトリに戻ることはできません。したがって、OLDPWDは使用されません。 –

4

bashは、プロンプトに示されているように、論理カレントディレクトリパスを追跡し、それに応じてcd ..のようなものを解釈します。あなただけcd(またはpushd)で、このようなパスを使用する場合、これはあなたが同じことをコマンド引数(または内部コマンドのパスで起こることを期待している場合が起こって、予想外のものを犠牲にし、物事はもう少し一貫なり、emacsvimを持っていますsymlinkハンドリングのための独自の設定可能なルールですが、ほとんどのコマンドはそれに対処するためにカーネルに依存しています)。