Bash は、PS1 で特殊文字が拡張されないことを示すメッセージを表示します。

Bash は、PS1 で特殊文字が拡張されないことを示すメッセージを表示します。

私の設定を設定しようとしています。PS1ランタイム条件による環境変数なので、次のようにします。PROMPT_COMMANDこの方法。$?値に基づいてbashプロンプトを変更したいと仮定すると、.bashrcプロンプトは次のようになります。

function prompt_command() {
    if [ $? -eq 0 ]; then
        BASH_PROMPT="\W --->"
    else
        BASH_PROMPT="[\t][\u][\w] -x->"
    fi;
}

PROMPT_COMMAND=prompt_command
PS1='${BASH_PROMPT} '

メリットを享受したいです。Bashプロンプトエスケープシーケンス。残念ながら、値はそのまま表示されるため、この方法は機能しません。

BASH_PROMPTまた、一部のツールで値を変更しているため、中間変数を使用する必要がありますPS1。たとえば、仮想環境に入るときが(venv)前に追加されるため、上書きされるため、動的PS1に更新できません。PS1prompt_command(venv)

これらの特別な値が正しく拡張されないのはなぜですか。サブシェルの生成を意味しない回避策はありますか?

答え1

これらの特殊値が適切に拡張されないのはなぜですか?

man 1 bash説明する:

Bashを使用すると、デコードされたバックスラッシュエスケープ特殊文字[...]を挿入して、これらのプロンプト文字列をカスタマイズできます。

(あなたの場合\t、、、、、)\u\w\W

文字列がデコードされた後、パラメータ拡張によって拡張されます。 [...]

したがって、\t背面は最初にデコードされ(ただしあなたのデコードではありませんPS1!)${BASH_PROMPT}後で拡張されます。この拡張機能では、バックスラッシュでエスケープされた特殊文字が表示されますが、遅すぎるとデコードされます。


サブシェルの生成を意味しない回避策はありますか?

はい。見つけました。ここ

Bash 4.4以降、@P拡張機能が利用可能

PS1='${BASH_PROMPT} '電話する代わりに

PS1='${BASH_PROMPT@P} '

これで$BASH_PROMPT、元のデコードと一致するように追加のデコードが行われますPS1

関連情報