當 cwd 是目錄的符號連結時,..(點點)如何在 bash 中解析
考慮以下文件夾結構:
. ├── test1 │ ├── nested1 │ ├── testfile11 │ └── testfile12 └── test2 ├── nested1 -> /path/to/dir/test1/nested1 └── testfile21
test2/nested1
是目錄的符號連結test1/nested1
。我希望,如果它是 cwd,..
會解析為test2
. 但是,我注意到了這種不一致:$ cd test2/nested1/ $ ls .. nested1 testfile11 testfile12 $ cd .. $ ls nested1 testfile21
touch
也表現得像ls
,在test1
.為什麼
..
作為參數cd
引用符號連結的父級,而(所有?)其他引用連結目錄的父級?是否有一些簡單的方法可以強制它引用相對於符號連結的路徑?即“對立面”readlink
?# fictional command ls $(linkpath ..)
編輯:使用 bash
命令
cd
和pwd
有兩種操作模式。
- -L 邏輯模式:符號連結未解析
- -P 物理模式:在執行操作之前解析符號連結
這裡要知道的重要一點是,
cd ..
它不呼叫系統呼叫chdir("..")
,而是縮短$PWD
shell 的變數,然後 chdirs 到那個絕對路徑。如果您處於物理模式,這與 call 相同
chdir("..")
,但在邏輯模式下,這是不同的。這裡的主要問題:POSIX 決定預設使用不太安全的邏輯模式。
如果你呼叫
cd -P
而不是 justcd
,那麼在一個chdir()
操作之後,返回值 fromgetcwd()
被放入 shell 變數中$PWD
,隨後cd ..
將帶你到物理上位於目前目錄之上的目錄。那麼為什麼 POSIX 預設值不那麼安全呢?
如果您在 POSIX 預設模式下越過了符號連結並執行以下操作:
ls ../*.c cd .. rm *.c
ls
您可能會刪除與之前命令列出的文件不同的文件。如果您喜歡更安全的物理模式,請設置以下別名:
alias cd='cd -P' alias pwd='pwd -P'
因為當使用多個選項
-L
並且-P
最後一個選項獲勝時,您仍然可以獲得其他行為。歷史背景:
Bourne Shell 和 ksh88 確實同時獲得了目錄跟踪程式碼。
Bourne Shell 確實獲得了更安全的物理行為,而 ksh88 同時確實獲得了預設的不太安全的邏輯模式以及選項
-L
和-P
. 可能是 ksh88 使用了 csh 行為作為參考。POSIX 採用了 ksh88 行為,而沒有討論這是否是一個好的決定。
順便說一句:當您進入絕對路徑
$PWD
長於. 就是這樣一個有缺陷的外殼。PATH_MAX``PATH_MAX``dash