Bash-Schleife – Wie stoppe ich die Schleife, wenn ich innerhalb eines Befehls Strg-C drücke?

Bash-Schleife – Wie stoppe ich die Schleife, wenn ich innerhalb eines Befehls Strg-C drücke?

Ich führe per Rsync einige Verzeichnisse aus. Ich habe ein Bash-Terminal geöffnet und führe etwa Folgendes aus:

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

Wenn ich das Ganze jedoch stoppen möchte, drücke ich Strg-C. Dadurch wird das rsync gestoppt, aber dann geht es weiter zum nächsten. In diesem Fall merke ich, was passiert ist, und drücke dann wie ein Verrückter Strg-C, bis alles wieder funktioniert.

Gibt es eine Möglichkeit, dies zu „beheben“. Ich möchte, dass ich, wenn ich eine solche Schleife habe und Strg-C drücke, zu meiner Bash-Shell zurückkehre.

Antwort1

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

Dadurch wird die Schleife auch beendet, wenn ein einzelner Rsync-Lauf aus irgendeinem Grund fehlschlägt.

Antwort2

Um Dennis‘ Antwort zu erweitern, Ihr Code könnte folgendermaßen aussehen:

trap "echo Exited!; exit;" SIGINT SIGTERM

Ein funktionierendes Beispiel (das zufälligerweise rsync verwendet) finden Sie unterhttp://gist.github.com/279849.

Antwort3

Sie können eine Falle für Strg-C stellen.

trap <command> SIGINT

führt die Anweisung aus, commandwenn Sie Strg+C drücken. Fügen Sie die trapAnweisung einfach irgendwo in Ihr Skript ein, an der Stelle, an der sie wirksam werden soll.

Antwort4

Wenn Sie eine Befehlsfolge in Klammern setzen, verhält sich die Folge wie ein einzelner Prozess, empfängt das SIGINT und wird beendet, wenn Sie Ctrl- drücken C:

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

Aber! Im Falle des rsyncBefehls sind mehrere Quellen zulässig, daher wäre es besser, den von Ihnen geschriebenen Code wie folgt zu schreiben:

rsync -a * example.com:somewhere/

verwandte Informationen