毎回いくつかのコマンドを実行するように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'
(*これを知りたい理由は年をとっています。似ているが重複しない質問\[..\]
拡張プログラムから出力されるようです)