私は現在、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
実際のパスを試してそのディレクトリを見つけたとします。この仮説を裏付ける証拠を見つけることは困難ですが、次のロジックに従うことができます。源泉何が起こっているのかを正確に理解してください(コードはあまりありません)。