Bash
Bash 的“cd”與符號連結的行為不一致
我目前正在嘗試了解 Bash
cd
在符號連結方面的行為。預設情況下,cd
應該遵循邏輯目錄結構並且不應該解析符號連結。
cd
在我的第一個例子中表現得像這樣。然而,我想出了第二個例子,它cd
似乎遵循物理結構。這是預期的行為嗎?有什麼不同?設置
$ 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
第二個例子
$ 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
好問題。假設您使用的是 bash,
cd
將預設使用以下符號連結。可以使用-P
和-L
標誌覆蓋此行為,這些標誌分別強制cd
使用物理路徑和連結路徑。我假設在您的第一個範例中,
cd
注意到符號連結後面沒有目錄路徑a
,因此它嘗試了物理路徑並找到了目錄。我無法輕易找到支持該假設的證據,但您可以按照原始碼中的邏輯來查看到底發生了什麼(程式碼不多)。