Ctrl-C en scripts de bash

22

¿Cómo implemento ctrl+ cmanejo en los scripts bash para que el script se interrumpa, así como el comando actualmente en ejecución lanzado por el script?

(Imagine que hay un script que ejecuta algún comando de ejecución prolongada. El usuario presiona ctrl+ ce interrumpe el comando, pero el script continúa.) Necesito que se comporte de una manera que ambos sean asesinados.

Kolypto
fuente
1
Si su sistema operativo tiene habilitado el control de trabajo, otra opción sería detener ese script (generalmente con crtl-z). Puede continuar ese trabajo en segundo plano con bg, eliminarlo o continuarlo en primer plano con fg. Vea la sección de la página de manual de bash JOB CONTROL.
ott--

Respuestas:

25

Para ello, cree una subrutina a la que desee llamar cuando se reciba SIGINT y deba ejecutarla trap 'subroutinename' INT.

Ejemplo:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0
Kvisle
fuente
2
Tenga en cuenta que también puede atrapar EXITen los casos en que tiene algo que desea ejecutar cada vez que el script se cierra, independientemente de cómo se detuvo. ( KILLexcepto, por supuesto).
Blrfl
¡Muchas gracias! Sin embargo, cuando se mata 'dormir', el shell aún podría ejecutar el siguiente comando mientras se ejecuta la rutina de captura: 'echo' en este caso ... ¿o me equivoco?
Kolypto
Eso no debería ser posible, no. No realiza tareas en paralelo.
Kvisle