Retomar um processo suspenso em um loop for

12

Estou executando no bash:

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

Eu Ctrl-Zno meio da corrida, e depois o fgseu ID do trabalho. Mas as iterações restantes não continuam a terminar. Eu quero saber porque?

Tim
fonte
2
Posso confirmar isso para for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, versão 4.2.53)
Hauke ​​Laging

Respostas:

10

Ctrl-Zsuspende o processo atualmente em execução. Em expressão

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

todos os comandos exceto convert(ou seja for, in, doe done) são bash's palavras-chave que funcionam no shell atual e shell não pode suspender-se (e não é a sua intenção de qualquer maneira). Portanto, quando você pressiona Ctrl-Ze o comando é convertsuspenso, o loop simplesmente sai, pois não há mais o que processar.

Se você deseja suspender o loop inteiro, basta executá-lo no ambiente do subshell:

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

O único shell que conheço que é capaz de suspender todo o loop no shell atual é zsh.

jimmij
fonte
4
Não, ele Ctrl-Zpode simplesmente suspender a instância de conversão, não há razão para que o loop não possa continuar e iniciar outra. Por algum motivo, bashinterrompe o loop. Quando eu testo no dashloop, outras conchas provavelmente fazem o mesmo.
Graeme
6
@Graeme continuar o loop com uma iteração suspensa parece perigoso para mim, pois o próximo passo pode depender do anterior. A única solução razoável para mim é suspender o loop inteiro e isso pode ser feito em sub- zshshell (na verdade, é capaz de suspender o loop inteiro em execução no shell atual).
jimmij
3
Essa é provavelmente a resposta - os bashdesenvolvedores provavelmente tiveram a mesma opinião que você. Porém, continuar o loop ainda é o que eu esperava, quando você interrompe o processo e devolve o controle ao shell, parece natural que ele continue de onde parou (e provavelmente seria o comportamento bashse eles não adicionassem código para fazer outra coisa).
Graeme