Bash

Bash 的“cd”與符號連結的行為不一致

  • March 9, 2019

我目前正在嘗試了解 Bashcd在符號連結方面的行為。預設情況下,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,因此它嘗試了物理路徑並找到了目錄。我無法輕易找到支持該假設的證據,但您可以按照原始碼中的邏輯來查看到底發生了什麼(程式碼不多)。

引用自:https://unix.stackexchange.com/questions/428785