如果我使用以下命令在终端中创建符号链接
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
打印什么?从逻辑上讲,它可能是
$dir1
,如果先cd -P ..
发生,然后发生,或者cd ..
cd -- "$(readlink -f)"
/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,几乎无需使用)。