
Ich habe ein bash lopp
als
#!/bin/bash
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
Ich unterbreche die lange Schleife durch eine Tastatureingabe wie, Ctrl+C
aber Ctrl+C
das beendet einfach das Skript. Ich suche nach einer Alternative, um den aktuellen Zyklus fortzusetzen und die Schleife nach Beendigung der Ausführung STUFF
im aktuellen Zyklus zu unterbrechen.
Antwort1
Eine Möglichkeit besteht darin, trap
das Strg-C-Signal zu verwenden und break
aus dem auszusteigen loop
, wie in:
#!/bin/bash
trap break INT
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
echo "I have broken out of the interminably long for loop"
trap - INT
sleep 1
echo "END."
Weitere Einzelheiten zur Funktionsweise finden Sie hier:
trap break INT
und auch
trap - INT
Wir verwenden „break“, um Trap mitzuteilen, dass wir break ausführen möchten, um die Schleife zu unterbrechen, wenn ein INT
(Interrupt- SIGINT
)Signal generiert wird (was beim Drücken von Strg+C passiert).
Anstelle von „break“ könnten wir beliebige Shell-Befehle in Anführungszeichen setzen, die ausgeführt werden, wenn das angegebene Signal (in unserem Fall INT) generiert wird.
Zuletzt führen wir Trap erneut aus, um -
den „INT“-Handler auf die Standardaktion zurückzusetzen.
Hier sind einige weitere Ressourcen zum Weiterlesen und Beispiele:
- Linuxjournal-Artikel zum Bash-Trap-Befehlgibt einige weitere Beispiele für die Verwendung von Trap und Nuancen zwischen den verschiedenen Optionen
- MIT Confluence-Seite zu Fallendeckt Bash- und Tcsh-Shells ab
- Leitfaden für Anfänger zur Verwendung von „Trap“ zum Abfangen von Signalen und Behandeln von Fehlern in Shell-Skriptenist ein ausführliches Zitat, das andere von der Tastatur gesendete Signale zeigt, sowie die Verwendung
kill -l
zum Anzeigen aller Signale undkill -l SIGNALNAME
zum Ermitteln ihres numerischen Werts.