Bash Loop: ¿Cómo detener el bucle cuando presiono Control-C dentro de un comando?

Bash Loop: ¿Cómo detener el bucle cuando presiono Control-C dentro de un comando?

Estoy sincronizando algunos directorios. Tengo una terminal bash abierta y estoy ejecutando algo como esto:

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done

Sin embargo, si quiero detener todo, presiono Control-C. Eso detiene el rsync, pero luego continúa con el siguiente. En este caso me doy cuenta de lo que pasó y luego simplemente presiono Control-C como un loco hasta que todo vuelve a funcionar.

¿Hay alguna manera de "arreglar" esto? Lo quiero así, si tengo un bucle como ese y presiono Control-C, me devolverá a mi shell bash.

Respuesta1

for DIR in * ; do rsync -a $DIR example.com:somewhere/ || break; done

Esto también saldrá del bucle si una ejecución individual de rsync falla por algún motivo.

Respuesta2

Para ampliar la respuesta de Dennis, su código podría verse así:

trap "echo Exited!; exit;" SIGINT SIGTERM

Para ver un ejemplo funcional (que involucra rsync), consultehttp://gist.github.com/279849.

Respuesta3

Puedes configurar una trampa para Control-C.

trap <command> SIGINT

ejecutará commandcuando se presione Control-C. Simplemente coloque la trapdeclaración en algún lugar de su guión en el punto donde desee que entre en vigencia.

Respuesta4

Cuando coloca una cadena de comandos entre paréntesis, la cadena actuará como un proceso único, recibirá el SIGINT y finalizará cuando presione Ctrl- C:

(for DIR in * ; do rsync -a "$DIR" example.com:somewhere/ ; done)

¡Pero! En el caso del rsynccomando, permite múltiples fuentes, por lo que el código que escribiste estaría mejor escrito como:

rsync -a * example.com:somewhere/

información relacionada