Warum wird die Schleife bei Verwendung von Bash und Anhalten einer while-Schleife gestoppt, nachdem sie fortgesetzt wurde? Kurzes Beispiel unten.
$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+ Stopped sleep 1
$ fg
sleep 1
$
Ich bin mit Signalen vertraut und ich vermute, dass dies das natürliche Verhalten von Bash ist, aber ich möchte besser verstehen, warum es sich so verhält.
bash
shell
signals
background-process
bkzland
quelle
quelle
$?
Rückkehr genau wiedergeben muss , und sotrue
ist es dann nichttrue
. wahrscheinlich. Meiner Ansicht nach.Antworten:
Dies sieht aus wie ein Fehler in mehreren Shells, es funktioniert wie erwartet mit ksh93 und zsh .
Hintergrund:
Die meisten Shells scheinen die while-Schleife innerhalb der Haupt-Shell und auszuführen
Bourne Shell setzt die gesamte Shell aus, wenn Sie ^ Z mit einer Nicht-Login-Shell eingeben
bash unterbricht nur die
sleep
und verlässt dann die while-Schleife, um eine neue Shell-Eingabeaufforderung zu druckendash macht diesen Befehl nicht suspendierbar
Mit ksh93 funktionieren die Dinge ganz anders:
ksh93 macht dasselbe, während der Befehl zum ersten Mal gestartet wird, aber wie
sleep
ein Buitin in ksh93 hat ksh93 einen Handler, der bewirkt, dass die while-Schleife die Haupt-Shell abzweigt und dann zum Zeitpunkt der Eingabe von ^ Z angehalten wird.Wenn Sie später in ksh93 eingeben
fg
, wird das gegabelte untergeordnete Element , das die Schleife noch ausführt, fortgesetzt.Sie sehen den Hauptunterschied beim Vergleich der Jobcontrol-Nachrichten von bash und ksh93:
Bash- Berichte:
[1]+ Stopped sleep 1
aber ksh93 berichtet:
^Z[1] + Stopped while true; do echo .; sleep 1; done
zsh verhält sich ähnlich wie ksh93
Mit beiden Shells haben Sie einen einzelnen Prozess (die Haupt-Shell), solange Sie nicht ^ Z eingeben, und zwei Shell-Prozesse, nachdem Sie ^ Z eingegeben haben.
quelle
dash
Wird das Signal nicht tatsächlich verarbeitet, wenn die Schleife endet? Im[d]?ash
Quellcode sind alle diese Makros für INTON und INTOFF überall verteilt, und normalerweise werden Signale, die in einem INTOFF- Zustand empfangen werden, tatsächlich bei (oder um) INTON verarbeitet . Jedenfalls bin ich nur neugierig, weil ich denke, dass Sie es besser wissen - es ist eine großartige Antwort. Danke.sleep 100
kann angehalten und fortgesetzt werdendash
, sodass sie anscheinenddash
über Probleme in diesem Befehl Bescheid weiß und die Jobsteuerung selektiv deaktiviert.dash
Leistung in anderen Shells erreichen, indem Sie die Multibyte-Verarbeitung eingestellt haben? und ja,dash
unterstützt die Jobsteuerung, aber der Standard besagt, dass eine interaktive Shell TSTP ignorieren sollte, und das Ausführen einer while-Schleife in der aktuellen Shell an einem interaktiven Terminal ist nicht weniger eine interaktive Shell als jede andere.Ich habe einen der Mitautoren von Bash über das Thema geschrieben, und hier ist seine Antwort:
Wenn also jemand einen Patch einreichen möchte, verwenden Sie die E-Mail-Adressen auf den Manpages.
quelle