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, command
wenn Sie Strg+C drücken. Fügen Sie die trap
Anweisung 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 rsync
Befehls sind mehrere Quellen zulässig, daher wäre es besser, den von Ihnen geschriebenen Code wie folgt zu schreiben:
rsync -a * example.com:somewhere/