2015-08-21 23 views
7

ich ein Skript wie folgt:Wie Strg + C verwenden ganze Skript zu stoppen nicht nur aktuelle Befehl

for ((i=0; i < $srccount; i++)); do 
    echo -e "\"${src[$i]}\" will be synchronized to \"${dest[$i]}\"" 
    echo -e $'Press any key to continue or Ctrl+C to exit...\n' 
    read -rs -n1 
    rsync ${opt1} ${opt2} ${opt3} ${src[$i]} ${dest[$i]} 
done 

Wenn ich Ctrl + C als Antwort drücken Befehl zu lesen, die ganze Skript wird gestoppt, aber wenn Ctrl + C gedrückt wird, während rsync Befehl ausgeführt wird, nur aktuelle rsync Befehl wird gestoppt und das Skript wird die FOR-Schleife fortgesetzt.

Gibt es eine Möglichkeit, das Skript zu sagen, ob der Benutzer Strg gedrückt + C während rsync läuft, stoppt rsync und Ausstieg aus dem Skript selbst?

+0

In der vorherigen Zeile des Skripts sind 'opt1',' opt2', 'opt3',' srccount', 'src' und' dest' definiert. –

+4

'Falle 'Ausgang" INT ". Siehe http://unix.stackexchange.com/a/48432/50240 – bishop

+0

@Bischof Danke, das hat funktioniert. Bitte schreibe es als Antwort, damit ich es annehmen kann. –

Antwort

7

Ctrl + C sendet das Unterbrechungssignal, SIGINT. Sie müssen bash sagen, um zu beenden, wenn es dieses Signal empfängt, über die trap eingebaut:

trap "exit" INT 
for ((i=0; i < $srccount; i++)); do 
    echo -e "\"${src[$i]}\" will be synchronized to \"${dest[$i]}\"" 
    echo -e $'Press any key to continue or Ctrl+C to exit...\n' 
    read -rs -n1 
    rsync ${opt1} ${opt2} ${opt3} ${src[$i]} ${dest[$i]} 
done 

Sie mehr im Wesentlichen tun kann, als nur Verlassen auf ein Signal zu empfangen. In der Regel wird das Bereinigen temporärer Dateien in Signalhandlern durchgeführt. Weitere Informationen finden Sie unter bash documentation.