Bash
如何在 bash 中使用符號連結再次上下 cd?
結構:
/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")
而不是 achdir("a/b/..")
。要獲得後者,您需要執行cd -P a/b/..
.重要的是要認識到它僅適用於
cd
(並且僅在某些shell 中)、(IMO,一個錯誤功能),而不適用於ls
或vi
其他任何東西(除非其他任何東西都是那些將這些路徑傳遞給cd
without的 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