最後のコマンド終了コードを bash プロンプトに設定

最後のコマンド終了コードを bash プロンプトに設定

私はUbuntu 18.04を実行しており、次のようにbashプロンプトを設定したいと思います。

user:~/Documents [14:22:07] 1 $

私のPS1は次のとおりです

ALERT_COLOR="$(tput setaf 1)"

# Display unsuccessful exit codes
function exit_status {
    last_status=$?
    if [[ $last_status != 0 ]]; then
        echo "$ALERT_COLOR[$last_status]"
    fi  
}

parse_git_branch() {
 git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\] \[\033[36m\][\t] \[$ALERT_COLOR\]$exit_status \[\033[0;37m\]\$ '
else
 PS1='${debian_chroot:+($debian_chroot)}\u:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt

終了コードを除いて、すべてがうまく機能します。終了コードは表示されません。$?PS1でこれを行うと、常に表示されます。0

ベストアンサー1

問題はここにあります:

PS1='...\[$ALERT_COLOR\]$exit_status ...\$ '
                        ^^

これはパラメータ拡張であるため、設定した関数は呼び出されません。たとえば$(exit_status)、fromなどのコマンド置換から関数を呼び出す必要がありますPROMPT_COMMAND。これは脱出に注意してください\[ .. \]。 Bashはこれを解釈します。今後プロンプトは別の拡張であるため、プロンプト文字列にハードコードする必要があります(プロンプトで拡張変数やその他の項目の一部にすることはできません)。

変数を拡張せずに素早く逃げることがあなたに逆さまに見える場合、私はあなたを責めることはできません。しかし、このように記録されています。:

また、次の表では、プロンプト変数に表示される特殊文字について説明しますPS1PS4[...] 文字列をデコードした後、パラメータ拡張、コマンド置換による拡張、[...]

次のように動作する必要があります。

normal_color=$'\033[00m'
red_color=$'\033[41m'
exit_color=$normal_color

set_exit_color() {
    if [ "$?" != 0 ]; then
        exit_color=$red_color
    else
        exit_color=$normal_color
    fi
}

PROMPT_COMMAND=set_exit_color
PS1='\[$exit_color\][$?]\[$normal_color\] \w\$ '

終了状態を維持するには一時変数が必要だと思いましたが、明らかにプロンプ​​トで拡張された値は変更PROMPT_COMMANDされません。$?プロンプト文字列内でコマンド置換を使用して関数を呼び出す場合は、コマンド置換の終了コードが適用されるため、回避策が必要です。このような:

normal_color=$'\033[00m'
red_color=$'\033[41m'
exit_color=$normal_color

exit_color() {
    exit_code=$?
    if [ "$exit_code" != 0 ]; then
        echo "$red_color"
    else
        echo "$normal_color"
    fi
    return "$exit_code"
}

PS1='\[$(exit_color)\][$?]\[$normal_color\] \w\$ '

コマンドの置換によって引き起こされるサブシェル分岐を保存するためにwithバージョンを使用しますPROMPT_COMMANDが、実際にはほとんど効果がありません。

おすすめ記事