Wznów zawieszony proces w pętli for

13

Pracuję w bash:

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

Jestem Ctrl-Zw trakcie uruchamiania, a następnie fgjego identyfikator pracy. Ale pozostałe iteracje nie kończą się. Zastanawiam się dlaczego?

Tim
źródło
2
Mogę potwierdzić, że dla for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, wersja 4.2.53)
Hauke ​​Laging

Odpowiedzi:

11

Ctrl-Zzawiesza aktualnie uruchomiony proces. W wyrazie

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

Wszystkie polecenia z wyjątkiem convert(czyli for, in, doi done) to bash„s kluczowych uruchomione w bieżącej powłoki i powłoki nie może zawiesić się (i to nie jest twój zamiar tak czy inaczej). Kiedy więc naciśniesz Ctrl-Z, a polecenie convertzawiesi się, pętla po prostu się zakończy, ponieważ nie ma już nic do przetworzenia.

Jeśli chcesz mieć możliwość zawieszenia całej pętli, po prostu uruchom ją w środowisku podpowłoki:

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

Jedyną znaną mi powłoką, która może zawiesić całą pętlę w bieżącej powłoce, jest zsh.

jimmij
źródło
4
Nie, Ctrl-Zmogą po prostu zawiesić jedną instancję konwersji, nie ma powodu, dla którego pętla nie mogłaby kontynuować i uruchomić innej. Z jakiegoś powodu bashzatrzymuje pętlę. Kiedy dashkontynuuję test w pętli, inne powłoki prawdopodobnie robią to samo.
Graeme,
6
@Graeme kontynuowanie pętli z zawieszoną jedną iteracją wydaje mi się niebezpieczne, ponieważ następny krok może zależeć od poprzedniego. Jedynym rozsądnym rozwiązaniem dla mnie jest zawieszenie całej pętli i można to zrobić w podpowłoce (faktycznie zshjest w stanie zawiesić całą pętlę działającą w bieżącej powłoce).
jimmij
3
To prawdopodobnie odpowiedź - bashprogramiści prawdopodobnie mieli taką samą opinię jak ty. Kontynuowanie pętli jest jednak tym, czego bym się spodziewał. Gdy zatrzymasz proces i ponownie włączysz sterowanie ręczne do powłoki, wydaje się naturalne, że wybrała miejsce, w którym została przerwana (i prawdopodobnie byłoby to zachowanie, bashgdyby nie dodali kod, aby zrobić coś innego).
Graeme