Mis*_*iev 6 command-line zsh signals
我$PS1在 Zsh 中包含这个表达式:%(?. %?.)
它的意思是“如果前一个命令 ( $?) 的退出代码为真,则显示$?,否则不显示”。这通常很有用,但有一件事让我烦恼:当我在没有运行命令的情况下按 Control+C 时,shell 将最后一个命令的返回码设置为非零!Zsh 将其设置为 1,Bash 将其设置为 130。Dash 是我系统上唯一一个不会在 Control+C 上重置它的 shell。
如何重现:
echo $?.有没有办法在 Zsh 上关闭这种行为?
我不认为有任何方法可以将其关闭。
首先想到的是让 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)$ '
Run Code Online (Sandbox Code Playgroud)
但还有另一个类似的问题:如果您暂停命令,您将获得退出状态 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
}
Run Code Online (Sandbox Code Playgroud)
如果您使用 zsh,请确保您setopt promptsubst的.zshrc.
如果您使用的是 bash,请添加:
PROMPT_COMMAND=precmd
trap preexec DEBUG
Run Code Online (Sandbox Code Playgroud)
但实际上你应该使用https://superuser.com/a/175802/15334中提到的更复杂的 DEBUG 陷阱
另一种可能性是它setopt printexitvalue足够接近你想要的。