Aktualisierung:trap erfordert das Entfernen von SIG prefix on condition, obwohl einige Shells es unterstützen. Siehe Kommentar unten.
Das kaufmännische Und "&" führt einen Befehl im Hintergrund in einem neuen Prozess aus. Wenn sein übergeordneter Prozess (der Befehl, der in Ihrem Fall das Bash-Skript ausführt) endet, setzt dieser Hintergrundprozess seinen übergeordneten Prozess auf init zurück (Prozess mit PID). 1), stirbt aber nicht. Wenn Sie ctrl+c drücken , senden Sie ein Interrupt-Signal an den Vordergrundprozess, das den Hintergrundprozess nicht beeinflusst.
Um den Hintergrundprozess zu beenden, sollten Sie den kill verwenden Befehl mit dem PID des neuesten Hintergrundprozesses, den Sie mit $! erhalten konnten .
Wenn Sie möchten, dass ctrl+c verwendet wird Um sowohl das Skript als auch den Hintergrundprozess zu beenden, können Sie Folgendes tun:
trap 'kill $BGPID; exit' INT
sleep 1024 & # background command
BGPID=$!
sleep 1024 # foreground command of the script
trap modifiziert den Trap-Handler von SIGINT (trap erfordert das Entfernen von SIG Präfix, aber einige Shells unterstützen es möglicherweise), sodass das Skript den Prozess mit $BGPID beendet bevor es beendet wird.