
tengo un bash lopp
como
#!/bin/bash
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
Interrumpo el bucle largo mediante una entrada de teclado, Ctrl+C
pero Ctrl+C
simplemente finalizo el script. Estoy buscando una alternativa para continuar el ciclo actual y romper el ciclo después de finalizar la ejecución STUFF
del ciclo actual.
Respuesta1
Una forma es a trap
la señal Control-C y break
fuera del loop
, como en:
#!/bin/bash
trap break INT
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
echo "I have broken out of the interminably long for loop"
trap - INT
sleep 1
echo "END."
Para obtener más detalles sobre cómo funciona esto, las líneas clave son:
trap break INT
y también
trap - INT
Usamos "break" para decirle a la trampa que queremos ejecutar break para romper el bucle cuando se genera la señal INT
(interrupción, también conocida como ) (lo que sucede cuando presiona Ctrl+C)SIGINT
En lugar de "romper", podríamos poner comandos de shell arbitrarios entre comillas, y eso se ejecutará cuando se genere la señal dada (INT en nuestro caso).
Por último, ejecutamos trap nuevamente -
para restaurar el controlador "INT" a la acción predeterminada.
Aquí hay algunos recursos más para lecturas adicionales y ejemplos:
- Artículo de Linuxjournal sobre el comando bash trapda algunos ejemplos más del uso de trampa y matices entre las diferentes opciones
- Página de confluencia del MIT sobre trampascubre shells bash y tcsh
- Guía para principiantes sobre el uso de "trampa" para captar señales y manejar errores en Shell ScriptLa cita es extensa y muestra otras señales enviadas por el teclado, así como el uso de
kill -l
para mostrar todas las señales ykill -l SIGNALNAME
encontrar su valor numérico.