33 votos

Bash Loop - Cómo detener el bucle al pulsar Control-C en el interior de un comando?

Estoy sincronizándose un par de directorios. Tengo un terminal de bash y estoy ejecutando algo como esto:

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

Sin embargo, si me quiero detener en el conjunto de las cosas, pulse Control-C. Que se detiene el rsync, pero luego se va a la siguiente. En este caso me doy cuenta de lo que ha sucedido y luego sólo tienes que pulsar Control-C como un loco hasta que las cosas funcionen de nuevo.

¿Hay alguna forma de "arreglar" este. Yo quiero así que si tengo un bucle como el que, y pulsar Control-C, que volverá a mi la shell de bash.

31voto

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

Esto también va a salir del bucle si un individuo rsync ejecutar falla por alguna razón.

24voto

jason saldo Puntos 5036

Puede establecer una trampa para el Control-C.

trap command SIGINT

se ejecutará el comando cuando el Control-C es presionado. Sólo tienes que poner la trampa de la declaración en algún lugar en la secuencia de comandos en un punto donde desea que sea efectivo.

24voto

IanGreenleaf Puntos 224

Para ampliar sobre Dennis respuesta, el código sería algo así:

trap "echo Exited!; exit;" SIGINT SIGTERM

Para un ejemplo de trabajo (que tienen rsync), echa un vistazo http://gist.github.com/279849.

6voto

amphetamachine Puntos 438

Cuando usted pone una cadena de comandos dentro de los paréntesis, la cadena actuará como un único proceso, y recibirá la SIGINT y terminar cuando se pulse Ctrl-C:

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

Pero! En el caso de la rsync de comando, que permite a múltiples fuentes, de modo que el código que escribió sería mejor-escrita como:

rsync -a * example.com:somewhere/

5voto

  1. Pulse Ctrl-Z a suspender la secuencia de comandos ;
  2. kill %%

Créditos, explicaciones y más detalles en esta respuesta.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: