Заставить PS1 Bash отображать исходное имя каталога, а не символическую ссылку?

Заставить PS1 Bash отображать исходное имя каталога, а не символическую ссылку?

В настоящее время у меня есть, 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 . ).

Связанный контент