ディレクトリ/dir1
と/dir2/linked
があり、後者は前者へのシンボリックリンクであるとします。
cd
からlinked
およびpwd
に移動すると、出力/dir2/linked
が得られます。その後、cd ..
を実行すると、/dir2
になります。この動作は、以前に/dir2/linked
にいるという概念と一致しています。ただし、私が理解しているように、任意のディレクトリの親ディレクトリ(..
)は、ディレクトリiノード(つまり、物理的にはディスク)に格納されます。明らかに、/dir2/linked
は実際には/dir1
であるため、iノードの親ディレクトリは/
である必要があります。
さらに複雑なことに、/dir2/linked
内では、ls ..
とcd .. ; ls .
の出力が異なります。 cd
はシンボリックリンクされたパスを尊重し、ls
は「物理的な」パスを尊重するようです。 この質問 で述べたように、このユースケースにはcd -P
があります。
man pwd
は「物理的」および「論理的」な作業ディレクトリについて言及していますが、現時点ではまだいくつか質問があります。
man pwd
で説明されているように、この動作は常にPWD
環境変数によって提供されますか?cd
とls
が両方ともシェルコマンド(つまり、プログラムではない)である場合、なぜ異なる動作をするのですか?PWD
を使用しますか?実装次第だと思いますが、経験則はありますか?bash
は、シンボリックリンクを「認識」し、シンボリックリンクを使用してディレクトリに入るときにこの情報を追跡します。
これを確認するには、例で次の手順を実行します。
$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1
空のPWD
変数でbashを開始する必要があります。そうしないと、そのトリックを使用して「偽の」パスが表示されます。
ls
is別のプログラムであるため、現在のディレクトリにどのように到達したかについてbashの知識がないことに注意してください。したがって、ls ..
は、フォローしたシンボリックリンクに関連するものではなく、real親ディレクトリの内容を表示するだけです。
プログラムを起動する方法はたくさんあるので、ほとんどのプログラムは環境変数CWD
に依存しません。bashシェルは1つしかないため、CWD
に正しい値が含まれていると期待するのは信頼できません(試してみてください)。 CWD
をbash -c pwd
、正気度の値をチェックしていることがわかります)。