Bash

指向目錄和相對路徑的符號連結

  • November 20, 2014

我已經創建了具有目錄絕對路徑(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 是通過跟隨符號連結進入一個目錄的。 lsstat()在“../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

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