Bashプロンプト:PROMPT_COMMANDで\ [と\]を使用する

Bashプロンプト:PROMPT_COMMANDで\ [と\]を使用する

私はbashプロンプトで作業しています。また、読みやすく保守しやすいようにプロンプ​​トをインテリジェントに作成しようとします。これは大きなものがないことを意味しますexport PS1

さまざまなソース(含まれていますこの問題)bashが長いコマンドでプロンプトを上書きしないようにするには、周辺の書式設定の必要性\[に関する情報を参照してください。\]

文字列を生成するときに最後のコマンド()の終了ステータスを赤で表示するか、0の場合は何も表示したくありませんPROMPT_LAST_EXIT_STATUS。これはうまくいきますが、テキストsとsがプロンプトに表示され、長いコマンドの問題が続きます。どこかに回避的な問題かもしれませんが、まだ見つかりませんでした。$?$?[]

予期しない角括弧

次のコードはにあります~/.bashrc

prompt_last_exit_status () {
PROMPT_LAST_EXIT_STATUS="${?}";
if [[ ${PROMPT_LAST_EXIT_STATUS} == "0" ]];
then
    PROMPT_LAST_EXIT_STATUS=
else
    PROMPT_LAST_EXIT_STATUS=\[$(tput setaf 1)$(tput bold)\]${PROMPT_LAST_EXIT_STATUS}
    PROMPT_LAST_EXIT_STATUS+=\[$(tput sgr0)\]
    PROMPT_LAST_EXIT_STATUS+=" "
fi;
}


prompt_command () {
    prompt_last_exit_status
}
export PROMPT_COMMAND=prompt_command

PS1="\${PROMPT_LAST_EXIT_STATUS}"
PS1+="\[$(tput setaf 6)$(tput bold)\]\w"
PS1+="\[$(tput sgr0)\] \$ \[$(tput sgr0)\]"
export PS1

ベストアンサー1

あなたの割り当ては引用されていないので、文字列にandを入れずにPROMPT_LAST_EXIT_STATUS単にandです(sはエスケープ文字と見なされるためです)。\[\][]\

比較する:

$ foo=\[hello\]
$ echo "$foo"
[hello]

比較:

$ foo="\[hello\]"
$ echo "$foo"
\[hello\]

さらに、パラメータ拡張(プロンプト文字列に変数を挿入)は、プロンプト特殊文字拡張後に発生します。したがって、変数に\[andを入れることは、拡張された場合はもはや特別ではないため機能しません。有効な代替方法は、色設定を無条件にすることです。たとえば、次のようになります。\]PROMPT_LAST_EXIT_STATUS$PROMPT_LAST_EXIT_STATUS\[\]

prompt_last_exit_status () {
    PROMPT_LAST_EXIT_STATUS="${?}"
    if [[ ${PROMPT_LAST_EXIT_STATUS} == "0" ]]
    then
        PROMPT_LAST_EXIT_STATUS=
    else
        PROMPT_LAST_EXIT_STATUS+=" "
    fi
}

prompt_command () {
    prompt_last_exit_status
}
export PROMPT_COMMAND=prompt_command

PS1="\[$(tput setaf 1)$(tput bold)\]\${PROMPT_LAST_EXIT_STATUS}\[$(tput sgr0)\]"
PS1+="\[$(tput setaf 6)$(tput bold)\]\w"
PS1+="\[$(tput sgr0)\] \$ \[$(tput sgr0)\]"
export PS1

おすすめ記事