让 Bash 的 PS1 显示原始目录名称而不是符号链接?

让 Bash 的 PS1 显示原始目录名称而不是符号链接?

我目前有PS1='\W',但是当在符号链接目录中时,提示显示符号链接名称,我怎样才能让 PS1 显示原始目录名称?

答案1

在 Linux 上,您可以使用以下命令:

export PS1='$( readlink -f . )'

例子:

$ export PS1='$( readlink -f . ) \$ '
/home/danielbeck $ ln -s /etc foo
/home/danielbeck $ cd foo
/etc $ _

请注意,您仍然需要进行/home/danielbeck/foo其他所有操作,例如使用 解析父目录cd ..,因此,继续该示例:

/etc $ cd ..
/home/danielbeck $ _

另一种选择可能是用cd进入规范目录而不是符号链接的函数来替换,例如:

function cd {
    if [[ $# -ne 1 ]] ; then
        builtin cd "$@"
    elif [[ "$1" = "-" ]] ; then
        builtin cd -
    else
        builtin cd "$( readlink -f "$1" )"
    fi
}

这也可能适用于任何cd论点和支持甚至CDPATH

function cd {
    builtin cd "$@"
    builtin cd "$( readlink -f . )"
}

答案2

为了给像我一样希望 PS1 通过取消引用的符号链接来解析的人提供一点帮助,请按如下方式编辑 .bashrc:

if [ "$color_prompt" = yes ]; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]$(readlink -f \w)\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:$(readlink -f \w)\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
        PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: $(readlink -f .)\a\]$PS1"
    ;;
*)
    ;;
esac

答案3

PS1您的文件中可能已经有自定义变量~/.bashrc,并且您想保留其他自定义内容。

长话短说...只需进入~/.bashrc,找到PS1变量的定义位置,然后替换\w$( readlink -f . )

相关内容