¿No estableces $? a distinto de cero en Control+C

¿No estableces $? a distinto de cero en Control+C

Mi $PS1en 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:

  1. Inicie zsh o bash.
  2. Presione Control+C.
  3. 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|148a la casedeclaració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 promptsubsten 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 printexitvaluese acerque lo suficiente a lo que deseas.

Respuesta2

Espero que esta pregunta todavía interese a la gente en 2019...

130es 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 zshtérminos, se traduce en:

%(0?..%(130?.. %F{red}%?%f))

Actualizar:usted escribió que zshestablece el código de salida en 1encendido Ctrl-Cy bashen 130. Aquí, en 2019, ambos bashy zshregresan 130.

información relacionada