结构:
/base/
+- somedir/
+- symlink/ -> /some_other_dir
该命令(除了我的 Makefiles 之外)失败:
cd /base/symlink
ls ../somedir
Bash 抱怨 ../somedir 不存在。同样,我在 some_other_dir 中引用 ../somedir 的 makefile 失败。然而, cd .. 按预期工作。我可以让我的 shell 按照逻辑结构行事吗?
答案1
..
是当前目录中的目录条目。它是指向上一级目录的硬链接。 /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
(并且仅适用于一些贝壳),(IMO,一个错误特征),不是ls
或vi
或任何其他东西(除非还要别的吗是这些 shell 的脚本,它将这些路径传递给cd
without -P
)。
在那些贝壳里,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