$を設定していませんか? 0以外の状態になるには、Ctrl + Cを押します。

$を設定していませんか? 0以外の状態になるには、Ctrl + Cを押します。

My in Zshには$PS1次の式が含まれています。%(?. %?.) これは、「$?前のコマンド()の終了コードがtrueの場合はそれを表示し$?、それ以外の場合は何も表示しません」を意味します。これは一般的に機能しますが、1つのバグがあります。コマンドを実行せずにCtrl + Cを押すと、シェルは最後のコマンドの戻りコードをゼロ以外の値に設定します。 Zshは1に設定し、Bashは130に設定します。 Dashは、私のシステムからControl + Cにリセットしない唯一のシェルです。

再現方法:

  1. zsh または bash を起動します。
  2. Ctrl+C を押します。
  3. echo $?

Zshでこの動作を無効にする方法はありますか?

ベストアンサー1

消す方法はないようです。

最初に考えるのは、コマンドが実行されたことを示すためにpreexecに変数を設定することです。プロンプトが表示されたらCtrl + Cを押すと設定されません。

precmd() {
    exit_status=$?
    if ! $ran_something; then
        exit_status=0
    fi
    ran_something=false
}
preexec() {
    ran_something=true
}
show_non_zero_exit_status() {
    case $exit_status in
    0)
        :;;
    *)
        echo $exit_status;;
    esac
}
PS1='$(show_non_zero_exit_status)$ '

しかし、別の同様の問題があります。コマンドを一時停止すると、終了状態は20(zsh < 5.0.7)または148(bashおよびzsh> = 5.0.7)になります。

この問題を解決するには、上記の説明20|148に以下を追加できます。case

show_non_zero_exit_status() {
    case $exit_status in
    0|20|148)
        :;;
    *)
        echo $exit_status;;
    esac
}

setopt promptsubstzshを使用している場合.zshrc

Bashを使用している場合は、以下を追加してください。

PROMPT_COMMAND=precmd
trap preexec DEBUG

ただし、実際には前述のより複雑なDEBUGトラップを使用する必要があります。https://superuser.com/a/175802/15334

もう一つの可能​​性は、それがsetopt printexitvalueあなたが望むものに十分近いということです。

おすすめ記事