如何在 bash 中使用符号链接再次上下 cd ?

如何在 bash 中使用符号链接再次上下 cd ?

结构:

/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,一个错误特征),不是lsvi或任何其他东西(除非还要别的吗是这些 shell 的脚本,它将这些路径传递给cdwithout -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

相关内容