Shell
了解目錄符號連結遍歷和父目錄
假設您有目錄
/dir1
和/dir2/linked
,後者是前者的符號連結。當你
cd
到linked
andpwd
時,你會得到輸出/dir2/linked
。如果你那麼cd ..
,你會被放上去的/dir2
。這種行為與你之前在的概念是一致的/dir2/linked
。但是,據我了解,..
任何目錄的父目錄 ( ) 都儲存在目錄 inode 中(即:物理上在磁碟中)。顯然,既然/dir2/linked
是真的/dir1
,inode上的父目錄一定是/
更複雜的是,在內部,和
/dir2/linked
的輸出是不同的!似乎尊重符號連結的路徑,同時尊重“物理”路徑。正如在這個問題中提到的,這個案例是有的。ls ..``cd .. ; ls .``cd``ls``cd -P
man pwd
提到“物理”和“邏輯”工作目錄,但此時我仍有一些問題:
- 如 ? 中所述,此行為是否始終由
PWD
環境變數提供man pwd
?- 如果它們都是shell命令(即:不是程序),為什麼預設
cd
並具有不同的行為?ls
- 典型程序(不是 shell 命令)是否使用
PWD
物理路徑而不是物理路徑?我意識到這取決於實施,但有什麼經驗法則嗎?
bash
“了解”符號連結並在您使用符號連結進入目錄時跟踪此資訊。您可以通過在範例中執行以下操作來檢查這一點:
$ cd /dir2 $ cd linked $ pwd /dir2/linked $ PWD='' bash -c pwd /dir1
您需要使用空
PWD
變數啟動 bash,否則它會使用該技巧來顯示“假”路徑。請注意,這
ls
是一個單獨的程序,因此 bash 不知道您如何到達目前目錄,因此ls ..
只會顯示真實父目錄的內容,而不是相對於您所遵循的符號連結。大多數程序將不依賴於環境變數
CWD
,因為啟動程序的方法有很多,通過 bash shell 只是其中一種,因此期望CWD
包含正確的值是不可靠的(在做之前嘗試設置CWD
錯誤bash -c pwd
,你可以看到它檢查理智的價值)。