恢复符号链接后的“cd ..”功能

恢复符号链接后的“cd ..”功能

如果我使用以下命令在终端中创建符号链接

ln -s /path/to/some/directory symbolicLink

然后点击链接

cd symbolicLink

终端似乎认为 cwd 是,~/symbolicLink/尽管它实际上显示的是~/path/to/some/directory/(当然,假设链接是在 中建立的~)。这意味着如果我随后输入 ,cd ..我将返回到~,因为终端“认为”这是 cwd 的父级。

我需要做哪些更改才能cd ..转到~/path/to/some/真实的父母~/path/to/some/directory/

答案1

https://stackoverflow.com/questions/10456784/behavior-of-cd-bash-on-symbolic-links

您可以使用“cd -P”转到“真实”父目录。请参阅顶部答案中的第一个评论,了解如何将此设为默认行为。

答案2

这种行为有一个微妙的警告cd -P(由于篇幅较长,因此作为答案发布):

$ dir1=$(mktemp --directory)
$ dir2=$(mktemp --directory)
$ ln -s -- "$dir1" /tmp/start
$ ln -s -- "$dir2" "$dir1"
$ cd "/tmp/start/"*
$ cd -P ..

现在应该pwd打印什么?从逻辑上讲,它可能是

  1. $dir1,如果先cd -P ..发生,然后发生,或者cd ..cd -- "$(readlink -f)"
  2. /tmp,如果先cd -P ..发生,然后发生。cd -- "$(readlink -f)"cd ..

事实上,它确实是后者,也就是说,pwd直观地高于“父”目录的级别。

答案3

另一种方法是运行:

cd $(/bin/pwd)/..

答案4

我理解你的痛苦——我认为bash这种行为基本上破坏了交互使用。

tcsh是一种对用户更加友好的交互式 shell。将其留给bash编程吧(如果您坚持要编写 shell 脚本,而许多脚本语言中却有更好的选择)。

要更改任何用户的 shell,请chsh在命令行中输入并按照提示进行操作(再次,我推荐/bin/tcsh优秀的 O'Reilly 书使用 csh 和 tcsh,几乎无需使用)。

相关内容