bg / fg innerhalb einer Befehlszeilenschleife

ctrl-z (^ z) verhält sich so, wie ich es nicht verstehe, wenn es in einer Schleife ausgeführt wird, die von einem Terminal aus ausgeführt wird.

Sage ich tippe

for ii in {0..100}; do echo $ii; sleep 1; done

dann drücke ich ^ z. Ich werde bekommen

[1]+  Stopped                 sleep 1

Ich kann den Job mit fg oder bg fortsetzen, aber der Job bezieht sich nur auf den Befehl sleep. Der Rest der Schleife ist anscheinend verschwunden und es erscheint keine Nummer mehr auf dem Terminal.

Ich könnte & nach dem Befehl verwenden, um es sofort im Hintergrund auszuführen, oder eine andere Lösung besteht darin, das Ganze in eine Subshell zu packen:

( for ii in {0..100}; do echo $ii; sleep 1; done )

then ^ z gibt mir

[1]+  Stopped                 ( for ii in {0..100};
do
    echo $ii; sleep 1;
done )

Dieser Job kann fortgesetzt werden und alle sind glücklich. Aber ich bin im Allgemeinen nicht daran gewöhnt, dies bei der Ausführung einer einmaligen Aufgabe zu tun, und die Frage, die ich stelle, ist, warum das erste Verhalten überhaupt stattfindet. Gibt es eine Möglichkeit, eine Befehlszeilenschleife anzuhalten, die nicht untergeordnet ist? Und was ist mit dem Rest der Schleife im ersten Beispiel passiert?

Bitte beachten Sie, dass dies für die Schleife spezifisch ist:

echo 1; sleep 5; echo 2

enn Sie im Schlaf auf ^ z drücken, wird dasecho 2 ausführen

1
^Z
[2]+  Stopped                 sleep 5
2

Oder sollte ich es mir nur zur Gewohnheit machen, & zu benutzen und es dunkle Magie zu nennen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage