Strg-C in Bash-Skripten

22

Wie implementiere ich die Behandlung von ctrl+ cin Bash-Skripten, sodass das Skript unterbrochen wird, sowie den aktuell ausgeführten Befehl, der vom Skript gestartet wird?

(Stellen Sie sich vor, es gibt ein Skript, das einen lang laufenden Befehl ausführt. Der Benutzer drückt ctrl+ cund unterbricht den Befehl, aber das Skript wird fortgesetzt.) Ich muss mich so verhalten, dass beide getötet werden.

kolypto
quelle
1
Wenn in Ihrem Betriebssystem die Jobsteuerung aktiviert ist, kann das Skript auch angehalten werden (normalerweise mit crtl-z). Sie können diesen Job im Hintergrund mit fortsetzen bg, ihn beenden oder im Vordergrund mit fortsetzen fg. Siehe den Abschnitt zur bash-Manpage JOB CONTROL.
ott--

Antworten:

25

Sie tun dies, indem Sie eine Unterroutine erstellen, die Sie aufrufen möchten, wenn SIGINT empfangen wird, und die Sie ausführen müssen trap 'subroutinename' INT.

Beispiel:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0
Kvisle
quelle
2
Beachten Sie, dass Sie auch EXITin Fällen, in denen Sie etwas ausführen möchten, einen Trap ausführen können, wenn das Skript beendet wird, unabhängig davon, wie es gestoppt wurde. ( KILL
Ausgenommen
Vielen Dank! Wenn jedoch "sleep" beendet wird, kann die Shell möglicherweise den nächsten Befehl ausführen, während die Trap-Routine ausgeführt wird: "echo" in diesem Fall ... oder irre ich mich?
kolypto
Das sollte nicht möglich sein, nein. Es werden keine Aufgaben parallel ausgeführt.
Kvisle