Control+Cで$?をゼロ以外に設定しないでください

Control+Cで$?をゼロ以外に設定しないでください

私の$PS1Zsh には、次の式が含まれています: 「前のコマンドの終了コード ( ) が true の%(?. %?.) 場合は を表示し、そうでない場合は何も表示しない」という意味です。 これは一般的には便利ですが、1 つ気になることがあります。コマンドを実行せずに Control+C を押すと、シェルが最後のコマンドの戻りコードを 0 以外に設定してしまうのです。 Zsh はこれを 1 に設定し、Bash はこれを 130 に設定します。 Dash は、私のシステムで Control+C でこれをリセットしない唯一のシェルです。$?$?

再現方法:

  1. zsh または bash を起動します。
  2. Control+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)$ '

しかし、もう 1 つ同様の問題があります。コマンドを中断すると、終了ステータス 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
}

zsh を使用している場合は、setopt promptsubstにがあることを確認してください.zshrc

bash を使用している場合は、以下を追加します。

PROMPT_COMMAND=precmd
trap preexec DEBUG

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

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

答え2

この質問が2019年でも人々の興味を引くことを願っています...

130かなり珍しい終了ステータスです (初期の UNIX 実装では終了ステータスは 128 までしか認識されないと思います) - したがって無視してください。

# pseudocode

if exit_status == 0 then
    do nothing
else
    if exit_status == 130 then
        do nothing
    else
        print " [red]exit_status[/red]"

言葉でzsh言えば、次のようになります。

%(0?..%(130?.. %F{red}%?%f))

アップデート:zsh終了コードを に設定し1Ctrl-Cbash設定すると記述しました130。ここでは、2019 では、bashと の両方zshが を返します130

関連情報