在我的主目录中~
,我发布了
ln -s Subfolder1/Subfolder2/Subfolder3
Subfolder3
然后我的主目录中有一个软链接文件夹。当我pushd
进入它时,两者pwd
都会dirs
显示我当前的工作目录(西德) 成为。我的 bash 提示符还包含/home/My.User.Name/Subfolder3
西德,显示为~/Subfolder3
。
我记得很多年前,在使用cd
或pushd
进入符号链接文件夹后,完整路径将在 bash 提示符中通过 、 和显示~/Subfolder1/Subfolder2/Subfolder3
。是否可以通过简单的设置来恢复这种行为?pwd
dirs
答案1
文档 ( man bash
,搜索象征性的) 显示您可以在每次使用cd
and时处理此问题pushd
,或者通过设置全局选项来处理此问题
cd -P path/through/symlink
pushd -P path
set -P
此全局选项切换bash
为在任何地方都使用真实路径
答案2
作为替代方案费德的回答,对于当前工作目录的一次性解除引用,您可以使用pwd -P
.不幸的是,它不适用于dirs
.
对于长期解决方案,您可以定义一个 shell 函数:
cd() {
command cd "$@" && command cd "$(pwd -P)"
}
(将其放入您的.bashrc
文件中。)这将导致该cd
函数运行cd
内置命令,如果成功,则获取绝对路径名并cd
执行那。 这将导致$PWD
设置为该路径,并导致它显示在 shell 提示符中。
在极少数情况下,第二个command cd
可能会失败。在这种情况下,您应该仍然位于您想要进入的目录中cd
,但您仍然会看到符号链接名称(并且该cd
函数可能会向您显示错误消息,即使(第一次)cd
成功)。可以想象,第二个cd
可能会带你出去您想要进入的目录,但我无法想到可能发生这种情况的场景。
答案3
对于一次性取消引用,还有推荐的realpath
实用程序:
[ferd ~]$ cd /var/tmp/
[ferd tmp]$ ln -s /home/ferd/Videos MyVideos
[ferd tmp]$ cd MyVideos
[ferd MyVideos]$ pwd
/var/tmp/MyVideos
[ferd MyVideos]$ realpath .
/home/ferd/Videos
让你的目录自动realpath
-ed 通常是一个 shell 选项;在 zsh 中是CHASE_LINKS
.
这不是默认值,因为它大大地混淆目录递归和..
语义等内容。 (我认为这甚至可以被视为安全漏洞。)
您应该仔细考虑它是否真的是您的交互式会话的最佳配置。 (根据我的经验,它似乎就像它一样......直到你尝试它。)