GREEN="\e[1;32m"
RED="\e[1;31m"
NONE="\e[m"
get_exit_status(){
es=$?
if [ $es -eq 0 ]
then
echo -e "${GREEN}${es}${NONE}"
else
echo -e "${RED}${es}${NONE}"
fi
}
get_path(){
#dummy function
echo "PATH"
}
PROMPT_COMMAND='exitStatus=$(get_exit_status)'
以下は正しいexitStatusを提供しますが、カラー変数は拡張されません。
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
ただし、以下は色を提供しますが、終了ステータスは更新されません。
PS1="${RED}\h $(get_path) ${exitStatus}${NONE} "
これを行う正しい方法は何ですか? ExitStatusと色の両方が機能するようにこの問題をどのように解決できますか?
ベストアンサー1
Gilesはあなたの主な問題を指摘しましたが、私はこれを別の方法で説明したいと思います。
バッシュは説明した特殊プロンプトエスケープただ今後プロンプトで変数を展開します。つまり、\e
プロンプトで拡張変数を使用してから直接操作しても効果はありませんPS1
。
たとえば、期待どおりに機能し、赤いテキストが表示されます。
PS1='\e[1;31m this is in red '
しかし、そうではありません。ただ\e
プロンプトにテキストを追加するだけです。
RED='\e[1;31m'
PS1="$RED not in red "
カラーエスケープを変数に保存するには、ANSI-C引用符($'...'
)を使用して変数にリテラルエスケープ文字を配置できます。
これを行うにはGREEN
、RED
およびの定義を変更して、NONE
その値が実際のエスケープシーケンスになるようにすることができます。
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
これにより、最初の一重PS1
引用符が機能します。
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
しかし、これは2番目の問題に直面します。
実行して押し続けると、カーソルはUp Arrow行Homeの先頭に戻りません。
この問題を解決するには、カラーエスケープシーケンスをPS1
含めて\[
囲むように変更します。\]
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
get_exit_status
出力に印刷(終了コード)と印刷されていない文字(カラーコード)が含まれており、プロンプトで正しく表示できないため、ここでは正しく使用できません。配置すると、\[...\]
不完全な印刷としてマークされ、これは間違っています。正しいカラーコードを印刷してから\[...\]
プロンプトにラップするように関数を変更する必要があります。