私の設定を設定しようとしています。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
に更新できません。PS1
prompt_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
。