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 drucken
dash 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 eingebenfg
, 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.
$?
Rückkehr genau wiedergeben muss , und sotrue
ist es dann nichttrue
. wahrscheinlich. Meiner Ansicht nach.