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

関連情報