Eu não acho que haja alguma maneira de desativá-lo.
O primeiro pensamento é ter o preexec definido uma variável que indica que um comando foi executado. Se você pressionasse Ctrl + C no prompt, não seria definido.
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)$ '
Mas há outro problema semelhante: se você suspender um comando, obterá o status de saída 20 (zsh < 5.0.7) ou 148 (bash e zsh > = 5.0.7).
Para contornar isso, você pode adicionar 20|148
à declaração case
acima, por exemplo
show_non_zero_exit_status() {
case $exit_status in
0|20|148)
:;;
*)
echo $exit_status;;
esac
}
Se você estiver usando zsh, verifique se tem setopt promptsubst
em .zshrc
.
Se você estiver usando o bash, adicione:
PROMPT_COMMAND=precmd
trap preexec DEBUG
mas você deve usar a armadilha DEBUG mais complicada mencionada no link
Outra possibilidade é que setopt printexitvalue
esteja perto o suficiente do que você deseja.