讓 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 . )

相關內容