
Mi $PS1
en Zsh incluye esta expresión: %(?. %?.)
Significa «si el código de salida del comando anterior ( $?
) es verdadero, muestra $?
, de lo contrario no muestra nada». Esto es generalmente útil, pero una cosa me molesta: los shells establecen el código de retorno del último comando en un valor distinto de cero cuando presiono Control+C sin ejecutar un comando. Zsh lo establece en 1, Bash lo establece en 130. Dash es el único shell en mi sistema que no lo restablece con Control+C.
Cómo reproducirse:
- Inicie zsh o bash.
- Presione Control+C.
echo $?
.
¿Hay alguna manera de desactivar este comportamiento en Zsh?
Respuesta1
No creo que haya forma de apagarlo.
Lo primero que se piensa es hacer que preexec establezca una variable que indique que se ejecutó un comando. Si presiona Ctrl+C cuando se le solicite, no se configurará.
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)$ '
Pero hay otro problema similar: si suspendes un comando, obtendrás el estado de salida 20 (zsh < 5.0.7) o 148 (bash y zsh >= 5.0.7).
Para evitar eso, puede agregar 20|148
a la case
declaración anterior, es decir
show_non_zero_exit_status() {
case $exit_status in
0|20|148)
:;;
*)
echo $exit_status;;
esac
}
Si estás usando zsh, asegúrate de tenerlo setopt promptsubst
en tu archivo .zshrc
.
Si estás usando bash, agrega:
PROMPT_COMMAND=precmd
trap preexec DEBUG
pero realmente deberías usar la trampa DEBUG más complicada mencionada enhttps://superuser.com/a/175802/15334
Otra posibilidad es que setopt printexitvalue
se acerque lo suficiente a lo que deseas.
Respuesta2
Espero que esta pregunta todavía interese a la gente en 2019...
130
es un estado de salida bastante raro (creo que UNIX, tal como se implementó en los primeros días, reconoce estados de salida solo hasta 128), así que ignórelo.
# pseudocode
if exit_status == 0 then
do nothing
else
if exit_status == 130 then
do nothing
else
print " [red]exit_status[/red]"
En zsh
términos, se traduce en:
%(0?..%(130?.. %F{red}%?%f))
Actualizar:usted escribió que zsh
establece el código de salida en 1
encendido Ctrl-C
y bash
en 130
. Aquí, en 2019, ambos bash
y zsh
regresan 130
.