Setzen Sie einen angehaltenen Prozess in einer for-Schleife fort

12

Ich renne in Bash:

for i in ull-*.pbm; do convert $i tmp2/$i.pdf ; done

Ich Ctrl-Zlaufe gerade, und dann ist fgseine Job-ID. Die verbleibenden Iterationen werden jedoch nicht fortgesetzt. Ich wundere mich warum?

Tim
quelle
2
Ich kann das für for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, Version 4.2.53)
Hauke ​​Laging

Antworten:

10

Ctrl-Zunterbricht den aktuell laufenden Prozess. Im Ausdruck

for i in ull-*.pbm; do convert "$i" "tmp2/$i.pdf" ; done

alle Befehle mit Ausnahme von convert(dh for, in, dound done) sind bash‚Keywords s in der aktuellen Shell ausgeführt und Shell selbst nicht unterbrechen kann (und es ist nicht Ihre Absicht sowieso). Wenn Sie also drücken Ctrl-Zund der Befehl convertangehalten wird, wird die Schleife einfach beendet, da nichts mehr zu verarbeiten ist.

Wenn Sie die gesamte Schleife anhalten möchten, führen Sie sie einfach in der Subshell-Umgebung aus:

(for i in ull-*.pbm; do convert "$i" "tmp2/$i.pdf" ; done)

Die einzige mir bekannte Shell, die in der Lage ist, die gesamte Schleife in der aktuellen Shell anzuhalten, ist zsh.

jimmij
quelle
4
Nein, das Ctrl-Zkönnte nur die eine Konvertierungsinstanz aussetzen, es gibt keinen Grund, warum die Schleife nicht fortgesetzt und eine andere gestartet werden könnte. Aus irgendeinem Grund bashstoppt die Schleife. Wenn ich in dashder Schleife weiter teste, machen andere Shells wahrscheinlich dasselbe.
Graeme
6
@Graeme Die Fortsetzung der Schleife mit einer angehaltenen Iteration erscheint mir gefährlich, da der nächste Schritt vom vorherigen abhängen kann. Die einzige vernünftige Lösung für mich ist, die gesamte Schleife auszusetzen. Dies kann in einer Subshell erfolgen (tatsächlich zshkann die gesamte Schleife, die in der aktuellen Shell ausgeführt wird, ausgesetzt werden ).
Jimmy
3
Das ist wahrscheinlich die Antwort - die bashEntwickler waren wahrscheinlich der gleichen Meinung wie Sie. Die Schleife fortzusetzen ist immer noch das, was ich erwartet hätte. Wenn Sie den Prozess stoppen und die Handsteuerung wieder auf die Shell übertragen, scheint es natürlich, dass sie dort aufhört, wo sie aufgehört hat (und wahrscheinlich das Verhalten ist, bashwenn sie nichts hinzugefügt haben Code, um etwas anderes zu tun).
Graeme