37 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.

35voto

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.

28voto

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.

26voto

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.

7voto

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

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

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/

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: