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
あなたが望むものに十分近いということです。
答え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
終了コードを1
onCtrl-C
とbash
toに設定するように作成します130
。ここ、2019年にbash
両方zsh
帰ってきました130
。