Shell

了解目錄符號連結遍歷和父目錄

  • August 26, 2018

假設您有目錄/dir1/dir2/linked,後者是前者的符號連結。

當你cdlinkedandpwd時,你會得到輸出/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,你可以看到它檢查理智的價值)。

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