Bash

如何在 bash 中使用符號連結再次上下 cd?

  • November 5, 2020

結構:

/base/
  +- somedir/
  +- symlink/  -> /some_other_dir

此命令(除了我的 Makefiles)失敗:

cd /base/symlink
ls ../somedir

Bash 抱怨 ../somedir 不存在。同樣,我在 some_other_dir 中引用 ../somedir 的 makefile 失敗。但是, cd .. 按預期工作。我可以讓我的 shell 對邏輯結構採取行動嗎?

..是目前目錄中的目錄條目。它是上一級目錄的硬連結。 /base/symlink/..實際上與/some_other_dir/.., 是同一個文件/(除非some_other_dir它本身也是指向其他地方的符號連結)。

在大多數 shell 中,特殊cd處理..,即不將其視為..目錄條目,而是將出現的..cd而不是系統的路徑名解析)解釋為刪除一級目錄。

例如,在 中cd a/b/..,shell 執行 achdir("a")而不是 a chdir("a/b/..")。要獲得後者,您需要執行cd -P a/b/...

重要的是要認識到它僅適用於cd(並且僅在某些shell 中)、(IMO,一個錯誤功能),而不適用於lsvi其他任何東西(除非其他任何東西都是那些將這些路徑傳遞給cdwithout的 shell 的腳本-P)。

在那些對 進行邏輯解釋的shell 中,內置函式和cd變數包含邏輯目前目錄而不是真實(物理)目錄,即可能帶有符號連結目錄組件的目錄。同樣,您可以使用來獲取物理工作目錄。..``pwd``$PWD``pwd -P

現在,如果你想做

cd /A/b
anything-but-cd ../c

實際上的意思是:

anything-but-cd /A/c

無論是否/A/b是符號連結,您都可以這樣做:

anything-but-cd "$(dirname -- "$PWD")/c"

或者

anything-but-cd "${PWD%/*}/c"

或與zsh

anything-but-cd $PWD:h/c

要刪除 3/*秒的結尾$PWD

anything-but-cd "${PWD%/*/*/*}/c" # POSIX
anything-but-cd $PWD:h:h:h/c      # zsh

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