Warum bricht Strg + C in der Konsole den Hintergrundprozess ab?

4

Können Sie erklären, warum Ctrl+ Cin meiner bashShell den Befehl beeinflusst, der zuvor im Hintergrund ausgeführt wurde mit:

`./my_script.sh 1` &

Der Befehl beendet die Ausführung sofort mit 130Code:

[1]+  Exit 130              `./my_script.sh 1` &

Das übliche Verhalten von Ctrl+ Cist, den Vordergrundprozess abzubrechen. Und was passiert hier?

Edit 1: (Meine Gedanken) Vielleicht etwas im Zusammenhang mit Backticks - hier beginnt der Child-Subshell-Prozess und er erhält irgendwie Ctrl+, Cwenn der Parent-Prozess ihn empfängt

Bearbeiten 2: Ich fand, dass Ctrl+ Calle Hintergrundprozesse stoppt, die von der aktuellen Shell mit der Verwendung von Backticks ausgeführt wurden.

John_West
quelle
War das der vorherige Befehl, der in Ihre Shell eingegeben wurde?
bgStack15
@bgStack Verstehe nicht: es ist ./my_script.sh 1&. Oder fragen Sie nach dem letzten Befehl vor Strg-C?
John_West
Ich habe vergessen, den Backticks im vorherigen Kommentar zu entgehen. Sollte lauten:`./my_script.sh 1` &
John_West

Antworten:

1

Wenn Sie den Befehl schreiben

`./my_script.sh 1` &

Sie führen eine Befehlsersetzung durch (siehe unten).
Praktischerweise führen Sie eine Subshell (die für die Backticks ``) im Hintergrund ( &) aus, in der Ihr Skript ausgeführt wird ( ./my_script.sh 1).

Die aktuelle Shell wartet auf das Ende der Ausführung ihrer Subshell, um ihre Ausgabe als Befehle auszuführen.
Die Subshell wartet auf das Ende Ihres Skripts.
Wenn Sie Ctrl + drückenC , unterbrechen Sie dieses Warten und geben das Signal SIGINTan das Kind weiter.

In diesem Moment versucht , der aktuell Shell als Befehl ausführen , um die Ausgabe bis jetzt erhalten ... und es erzeugt den Fehler , 130das heißt , „Script terminierte durch Strg-C“ [ 2 ] .


Sowohl mit den Backticks ``als auch mit $()in bash führen Sie eine Befehlsersetzung durch [ 1 ] :

Bash führt die Erweiterung durch, indem COMMAND ausgeführt und die Befehlsersetzung durch die Standardausgabe des Befehls ersetzt wird, wobei alle nachfolgenden Zeilenumbrüche gelöscht werden.

zum Beispiel

echo `date`   
Thu Feb 6 10:06:20 CET 2003 

Beachten Sie, dass bei Ausführung im Hintergrund mehr Befehle dieser Art verwendet werden

`./myscript 1` &
`./myscript 2` &
`./myscript 3` &

Es ist immer die aktuelle Shell, die auf alle untergeordneten Ausgaben wartet. Ein einzelnes Ctrl+ Cbeendet das Warten auf alle zusammen.

Wenn Sie stattdessen das Ende des Skripts abwarten, versucht die aktuelle Shell, ihre Ausgabe auszuführen, sobald sie fertig ist.

Hastur
quelle
Ja, es führt die Ausgabe wirklich aus! Vielen Dank für die Erklärung! Und ist "Weiterleiten des Signals SIGINTan das Kind" das Standardverhalten von bash? Oder nur bei Verwendung der Befehlsersetzung?
John_West
1
Die Sekunde, die du gesagt hast. Übrigens, machen Sie ein paar Tests ... sleep 10; echo okals Skript ... &... ctrl c ... genießen Sie Ihre Zeit!
Hastur