“cd”到符号链接目录,希望当前工作目录是完整路径

“cd”到符号链接目录,希望当前工作目录是完整路径

在我的主目录中~,我发布了

ln -s Subfolder1/Subfolder2/Subfolder3

Subfolder3然后我的主目录中有一个软链接文件夹。当我pushd进入它时,两者pwd都会dirs显示我当前的工作目录(西德) 成为。我的 bash 提示符还包含/home/My.User.Name/Subfolder3西德,显示为~/Subfolder3

我记得很多年前,在使用cdpushd进入符号链接文件夹后,完整路径将在 bash 提示符中通过 、 和显示~/Subfolder1/Subfolder2/Subfolder3。是否可以通过简单的设置来恢复这种行为?pwddirs

答案1

文档 ( man bash,搜索象征性的) 显示您可以在每次使用cdand时处理此问题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.

这不是默认值,因为它大大地混淆目录递归和..语义等内容。 (我认为这甚至可以被视为安全漏洞。)

您应该仔细考虑它是否真的是您的交互式会话的最佳配置。 (根据我的经验,它似乎就像它一样......直到你尝试它。)

相关内容