Fazer o PS1 do Bash mostrar o nome do diretório original e não o link simbólico?

Fazer o PS1 do Bash mostrar o nome do diretório original e não o link simbólico?

Atualmente tenho PS1='\W', mas quando estou em um diretório com link simbólico, o prompt mostra o nome do link simbólico, como posso fazer com que o PS1 mostre o nome do diretório original?

Responder1

No Linux, você pode usar o seguinte:

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

Exemplo:

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

Observe que você ainda estará envolvido /home/danielbeck/fooem todo o resto, como resolver diretórios pais com cd .., então, para continuar o exemplo:

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

Outra opção pode ser substituir cdpor uma função que entre no diretório canônico em vez do link simbólico, algo como:

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

Isso também pode funcionar para quaisquer cdargumentos e suportes CDPATH:

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

Responder2

Para adicionar um pouco de ajuda para pessoas como eu que desejam que o PS1 resolva com links simbólicos desreferenciados, edite .bashrc assim:

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

Responder3

Provavelmente, você já possui uma PS1variável personalizada em seu ~/.bashrcarquivo e deseja manter suas outras personalizações.

Resumindo... basta entrar ~/.bashrc, descobrir onde PS1a variável está definida e substituir \wpor $( readlink -f . ).

informação relacionada