Linux

當 cwd 是目錄的符號連結時,..(點點)如何在 bash 中解析

  • August 1, 2018

考慮以下文件夾結構:

.
├── 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

命令cdpwd有兩種操作模式。

  • -L 邏輯模式:符號連結未解析
  • -P 物理模式:在執行操作之前解析符號連結

這裡要知道的重要一點是,cd ..它不呼叫系統呼叫chdir(".."),而是縮短$PWDshell 的變數,然後 chdirs 到那個絕對路徑。

如果您處於物理模式,這與 call 相同chdir(".."),但在邏輯模式下,這是不同的。

這裡的主要問題:POSIX 決定預設使用不太安全的邏輯模式。

如果你呼叫cd -P而不是 just cd,那麼在一個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

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