Bashの「cd」はシンボリックリンクと一貫して動作しません。

Bashの「cd」はシンボリックリンクと一貫して動作しません。

私は現在、cdシンボリックリンクに関連するBashの動作を理解しようとしています。デフォルトでは、cd論理ディレクトリ構造に従う必要があり、シンボリックリンクは解釈されるべきではありません。

cd最初の例では、動作は似ています。しかし、私はcd物理的な構造に従うように見える2番目の例を思いつきました。これが予想される動作ですか?違いは何ですか?

設定

$ cd
$ mkdir -p test/a/b/c test/d
$ tree test
test
├── a
│   └── b
│       └── c
└── d

4 directories, 0 files
$ cd test/d
$ ln -s ../a/b/c symlink

最初の例

$ pwd
/home/hexcabron/test/d
$ tree ..
..
├── a
│   └── b
│       └── c
└── d
    └── symlink -> ../a/b/c

5 directories, 0 files
$ cd symlink/../../a
$ pwd
/home/hexcabron/test/a

2番目の例

$ cd ../d
$ pwd
/home/hexcabron/test/d
$ mkdir -p symlink/../e
$ tree ..
..
├── a
│   └── b
│       ├── c
│       └── e
└── d
    └── symlink -> ../a/b/c

6 directories, 0 files
$ cd symlink/../e
$ pwd
/home/hexcabron/test/a/b/e

ベストアンサー1

良い質問。 bashを使用すると仮定すると、デフォルトではcd次のシンボリックリンクが使用されます。この動作は、フラグを-P使用-Lしてオーバーライドでき、cdそれぞれ物理パスとリンクパスを使用するように強制されます。

cd最初の例では、Symlinkの後ろにディレクトリパスがないことに気づき、a実際のパスを試してそのディレクトリを見つけたとします。この仮説を裏付ける証拠を見つけることは困難ですが、次のロジックに従うことができます。源泉何が起こっているのかを正確に理解してください(コードはあまりありません)。

おすすめ記事