Reprendre un processus suspendu dans une boucle for

13

Je cours en bash:

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

Je suis Ctrl-Zau milieu de la course, puis fgson ID de travail. Mais les itérations restantes ne continuent pas de se terminer. Je me demande pourquoi?

Tim
la source
2
Je peux confirmer que pour for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, Version 4.2.53)
Hauke ​​Laging

Réponses:

11

Ctrl-Zsuspend le processus en cours d'exécution. En expression

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

toutes les commandes sauf convert(c. -à for, in, doet done) sont bashles mots - clés « en cours d' exécution dans le shell courant et la coquille ne peut pas se suspendent (et ce n'est pas votre intention de toute façon). Ainsi, lorsque vous frappez Ctrl-Zet que la commande est convertsuspendue, la boucle s'arrête simplement car il n'y a plus rien à traiter.

Si vous voulez pouvoir suspendre la boucle entière, exécutez-la simplement dans l'environnement de sous-shell:

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

Le seul shell que je connaisse capable de suspendre toute la boucle dans le shell actuel est zsh.

jimmij
la source
4
Non, le Ctrl-Zpourrait simplement suspendre une instance de conversion, il n'y a aucune raison pour que la boucle ne puisse pas continuer et en démarrer une autre. Pour une raison quelconque bash, la boucle s'arrête. Lorsque je teste dans dashla boucle continue, d'autres shells font probablement de même.
Graeme du
6
@Graeme continuer la boucle avec une itération suspendue me semble dangereux car la prochaine étape peut dépendre de la précédente. La seule solution raisonnable pour moi est de suspendre toute la boucle et cela pourrait être fait en sous-shell ( zshest en fait capable de suspendre toute la boucle en cours d'exécution dans le shell actuel).
jimmij
3
C'est probablement la réponse - les bashdéveloppeurs avaient probablement la même opinion que vous. Continuer la boucle est toujours ce à quoi je m'attendais cependant, lorsque vous arrêtez le processus et que vous contrôlez manuellement le shell, il semble naturel qu'il reprenne là où il bashs'était arrêté (et ce serait probablement le comportement s'il n'ajoutait pas code pour faire autre chose).
Graeme