57 votes

Bash Loop - Comment arrêter la boucle lorsque j'appuie sur Control-C à l'intérieur d'une commande ?

Je rsyncise quelques répertoires. J'ai un terminal bash ouvert et j'exécute quelque chose comme ceci :

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

Cependant, si je veux tout arrêter, j'appuie sur Control-C. Cela arrête le rsync, mais il continue à passer au suivant. Dans ce cas, je réalise ce qui s'est passé et j'appuie sur Control-C comme un fou jusqu'à ce que les choses fonctionnent à nouveau.

Existe-t-il un moyen de résoudre ce problème ? Je veux que si j'ai une boucle comme celle-là, et que j'appuie sur Control-C, cela me renvoie à mon Shell de bash.

49voto

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

Cela permettra également de sortir de la boucle si une exécution individuelle de rsync échoue pour une raison quelconque.

42voto

Pour développer la réponse de Dennis, votre code pourrait ressembler à ceci :

trap "echo Exited!; exit;" SIGINT SIGTERM

Pour un exemple pratique (qui implique rsync), voir http://gist.github.com/279849 .

30voto

jason saldo Points 5036

Vous pouvez mettre en place un piège pour Control-C.

trap <command> SIGINT

exécutera le command lorsque l'on appuie sur Control-C. Il suffit de placer le trap quelque part dans votre script à un moment où vous voulez qu'elle devienne effective.

19voto

  1. Presse Ctrl-Z pour suspendre le script ;
  2. kill %%

Crédits, explications et plus de détails dans cette réponse .

10voto

Nick Kavadias Points 4557

Lorsque vous placez une chaîne de commandes entre parenthèses, la chaîne agira comme un processus unique, recevra le SIGINT et se terminera lorsque vous appuierez sur la touche Ctrl - C :

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

Mais ! dans le cas de la rsync elle autorise les sources multiples, de sorte que le code que vous avez écrit serait mieux rédigé sous la forme suivante :

rsync -a * example.com:somewhere/

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X