Bash
指向目錄和相對路徑的符號連結
我已經創建了具有目錄絕對路徑(Blink)的符號連結,並且具有例如以下樹:
$ ls -l /tmp/A total 0 lrwxrwxrwx 1 root root 6 Apr 3 12:27 Blink -> /tmp/B -rw-r--r-- 1 root root 0 Apr 3 12:27 foo $ ls -l /tmp/B total 0 -rw-r--r-- 1 root root 0 Apr 3 12:27 bar
然後我轉到 /tmp/A 並將目錄更改為 Blink:
$ cd /tmp/A $ pwd /tmp/A $ cd Blink $ pwd /tmp/A/Blink
cd ..
返回我,/tmp/A
但如果我輸入例如ls ../foo
我會得到錯誤:ls: ../foo: No such file or directory
內置 cd 命令根據需要解析路徑,但外部 ls 將 .. 視為 /tmp/B 的上一級,因此找不到 foo。
這裡有什麼問題?我可以通過 ../foo 等相對路徑從 /tmp/A/Blink 獲取 foo 文件嗎?
我不認為你能做到這一點。如今,Shell 會跟踪它們是如何到達位置的,它們會按名稱跟踪目前的工作目錄,而不是僅僅依靠文件系統和作業系統來保存它。這意味著內置
cd
可以“備份”符號連結,而不是直接跟隨“..”鏈。但是當你執行時
ls ../foo
,你ls
並不知道 shell 是通過跟隨符號連結進入一個目錄的。ls
將stat()
在“../foo”上做一個。“..”部分來自目前目錄,它的父目錄只有一個“..”條目。整個符號連結的事情並沒有改變目錄只有一個“。”的方式。和一個“..”條目。符號連結讓核心在文件路徑中插入一個額外的間接層。當您將 “../whatever” 傳遞給open()
orstat()
時,核心僅使用執行呼叫的程序的目前工作目錄來確定哪個單個目錄以 “..” 命名。
shell 將目前工作目錄儲存在
$PWD
. 如您所見,這就是 shell 內置函式cd
和所使用的,它將符號連結視為普通目錄。pwd
有時這很有幫助,有時沒有。
pwd
您可以使用(鍵入以獲取更多詳細資訊)找到真正的目錄help pwd
:$ pwd /tmp/A/Blink $ pwd -L /tmp/A/Blink $ pwd -P /tmp/B
同樣,
cd
有一個選項-P
(再次,help cd
是你的朋友):$ cd /tmp/A/Blink $ pwd /tmp/A/Blink $ cd -P .. $ pwd -P /tmp
最後,您可以完全關閉“功能”:
$ set -P $ cd /tmp/A/Blink $ pwd /tmp/B