Bashのプロンプト制御機能はかなり静的です。さらに制御したい場合は、プロンプトに変数を含めることができます。promptvars
オプションをオフにしていないことを確認してください。
PS1='${PWD#"${PWD%/*/*}/"} \$ '
単一引用符に注意してください。変数の展開は、PS1
変数が定義されたときではなく、プロンプトが表示されたときに行われる必要があります。
表示内容をさらに制御したい場合は、コマンド置換を使用できます。たとえば、上記のスニペット~
はホームディレクトリの略語を失います。
PS1='$(case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac; printf %s "$HPWD") \$ '
このコードはかなり扱いにくいため、PS1
変数に固定する代わりに、PROMPT_COMMAND
変数を使用してコードを実行HPWD
し、プロンプトでそれを使用できます。
PROMPT_COMMAND='case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac'
PS1='$HPWD \$'
短縮プロンプトはディレクトリの変更時にのみ変更されるため、プロンプトが表示されるたびにプロンプトを再計算する必要はありません。Bashには、現在のディレクトリの変更で実行されるフックはありませんが、オーバーライドしてそのいとこを使用してシミュレートできますcd
。
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac
}
PS1='$HPWD \$'
export PS1
は、環境変数ではなくシェル設定であるため、必要ではないことに注意してください。bash PS1
設定は、他のシェルでは理解されません。
PS優れたインタラクティブシェルエクスペリエンスが必要な場合は、これらすべて(主にtcsh などを含むプロンプト展開)がネイティブ機能であるzshに切り替えます。%
chpwd
PS1='%2~ %# '
PS1='\w \$'; PROMPT_DIRTRIM=2
は、同等のbashを提供する必要がありますが、それは私のシステムでは適切に機能しません。