Reanudar un proceso suspendido en un bucle for

13

Estoy corriendo en bash:

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

Estoy Ctrl-Zen medio de la carrera, y luego fgsu identificación de trabajo. Pero las iteraciones restantes no continúan terminando. ¿Me pregunto porque?

Tim
fuente
2
Puedo confirmar eso para for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, Versión 4.2.53)
Hauke ​​Laging

Respuestas:

11

Ctrl-Zsuspende el proceso actualmente en ejecución. En expresión

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

todos los comandos excepto convert(es decir for, in, doy done) son bashpalabras clave 's que se ejecutan en el shell actual y la cáscara no puede suspender en sí (y no es su intención de todos modos). Entonces, cuando golpeas Ctrl-Zy el comando se convertsuspende, el bucle simplemente se cerrará ya que ya no hay nada que procesar.

Si desea poder suspender todo el ciclo, simplemente ejecútelo en el entorno de subshell:

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

El único shell que sé que es capaz de suspender todo el ciclo en el shell actual es zsh.

jimmij
fuente
44
No, Ctrl-Zsimplemente podría suspender una instancia de conversión, no hay ninguna razón por la cual el ciclo no pueda continuar e iniciar otra. Por alguna razón bashdetiene el ciclo. Cuando la prueba en dashel bucle continúa, otros shells probablemente hagan lo mismo.
Graeme
66
@Graeme continuar el ciclo con una iteración suspendida me parece peligroso ya que el siguiente paso puede depender del anterior. La única solución razonable para mí es suspender todo el ciclo y podría hacerse en subshell (en realidad zshes capaz de suspender todo el ciclo que se ejecuta en el shell actual).
jimmij
3
Esa es probablemente la respuesta: los bashdesarrolladores probablemente tuvieron la misma opinión que usted. Sin embargo, continuar con el ciclo sigue siendo lo que hubiera esperado, cuando detiene el proceso y devuelve el control manual al shell, parece natural que continúe donde lo dejó (y probablemente sería el comportamiento bashsi no agregaran código para hacer otra cosa).
Graeme