
私の$PS1
Zsh には、次の式が含まれています: 「前のコマンドの終了コード ( ) が true の%(?. %?.)
場合は を表示し、そうでない場合は何も表示しない」という意味です。 これは一般的には便利ですが、1 つ気になることがあります。コマンドを実行せずに Control+C を押すと、シェルが最後のコマンドの戻りコードを 0 以外に設定してしまうのです。 Zsh はこれを 1 に設定し、Bash はこれを 130 に設定します。 Dash は、私のシステムで Control+C でこれをリセットしない唯一のシェルです。$?
$?
再現方法:
- zsh または bash を起動します。
- Control+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)$ '
しかし、もう 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
終了コードを に設定し1
、Ctrl-C
にbash
設定すると記述しました130
。ここでは、2019 では、bash
と の両方zsh
が を返します130
。