$を設定していませんか? 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あなたが望むものに十分近いということです。

答え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終了コードを1onCtrl-Cbashtoに設定するように作成します130。ここ、2019年にbash両方zsh帰ってきました130

関連情報