BASH - PS1をカスタマイズしてコマンドを実行する

BASH - PS1をカスタマイズしてコマンドを実行する

毎回いくつかのコマンドを実行するようにPS1を修正したいと思います。欲しいとしましょう。最後に実行されたコマンドが成功すると、PS1の末尾に緑色のスマイルが追加され、そうでなければスマイルは赤色になるはずです。
私はそれを関数として抽出しました。

function exit_smile {

    EXITSTATUS="$?"
    RED="\[\e[1;31m\]"
    GREEN="\[\e[32;1m\]"

    if [ "${EXITSTATUS}" -eq 0 ]
    then
       SMILE="${GREEN}:)"
    else
       SMILE="${RED}:("
    fi

    echo -n "$SMILE"
}

その後、PS1変数を変更するときとを使用しようとしますが、`exit_smile`PS1を変更したり色の代わりにテキストを印刷したりするときに\$(exit_smile)一度だけ実行します。例えば\[\e...\]

PROMPT="\u@\h \W"
PS1="${PROMPT} \$ \$(exit_smile) ${OFF}\n"

与えられたusername@hostname ~ $ \[\e[32;1m\]:)
私は何を見逃していますか?

答え1

これがバージョン間で変更されたかどうかはわかりませんが、(*)私のBashのマニュアルページは次のようになります。

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

(リストには背中が含まれてい\eます\[\]

後ろに文字列はデコードされ、パラメータ拡張、コマンド置換などを介して拡張されます。

\[..\]つまり、コマンド置換から出ることはできず、コマンド置換の前になければならないことを意味します。

\u(これはまた、コマンド置換の引数としてまたはを使用することができ、コマンドが実行される前に置き換えられることを意味します。そして、コマンド置換を入れることが何をするのかわかりません\w...他の場合にはもっと便利です\[..\]。意味があります。

したがって、カラーコードを別の拡張子に入れて手動で保護する必要があります\[..\]。コマンド置換の代わりに変数を使用し、$'...'拡張を使用してESC文字を取得します。

prompt_smile() {
        if [ "$?" = 0 ] ; then
                smile=' :) '
                smilecolor=$'\e[1;32m'
        else
                smile=' :( '
                smilecolor=$'\e[1;31m'
        fi
        normalcolor=$'\e[0m'
}

PROMPT_COMMAND=prompt_smile
PS1='\u@\h \W \$ \[$smilecolor\]$smile\[$normalcolor\]\n'

(*これを知りたい理由は年をとっています。似ているが重複しない質問\[..\]拡張プログラムから出力されるようです)

関連情報