My in Zshには$PS1
次の式が含まれています。%(?. %?.)
これは、「$?
前のコマンド()の終了コードがtrueの場合はそれを表示し$?
、それ以外の場合は何も表示しません」を意味します。これは一般的に機能しますが、1つのバグがあります。コマンドを実行せずにCtrl + Cを押すと、シェルは最後のコマンドの戻りコードをゼロ以外の値に設定します。 Zshは1に設定し、Bashは130に設定します。 Dashは、私のシステムからControl + Cにリセットしない唯一のシェルです。
再現方法:
- zsh または bash を起動します。
- Ctrl+C を押します。
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 promptsubst
zshを使用している場合.zshrc
。
Bashを使用している場合は、以下を追加してください。
PROMPT_COMMAND=precmd
trap preexec DEBUG
ただし、実際には前述のより複雑なDEBUGトラップを使用する必要があります。https://superuser.com/a/175802/15334
もう一つの可能性は、それがsetopt printexitvalue
あなたが望むものに十分近いということです。