Возобновить приостановленный процесс в цикле for

13

Я бегу в Баш:

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

Я Ctrl-Zв середине работы, а затем fgего идентификатор работы. Но остальные итерации не продолжают заканчиваться. Интересно, почему?

Тим
источник
2
Я могу подтвердить, что для for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, Версия 4.2.53)
Hauke ​​Laging

Ответы:

11

Ctrl-Zприостанавливает текущий запущенный процесс. В выражении

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

все команды , кроме convert(то есть for, in, doи done) являются bash«s ключевыми словами , работающими в текущей оболочке и оболочка не может приостановить себя (и это не ваши намерения , так или иначе). Поэтому, когда вы нажимаете Ctrl-Zи команда convertприостанавливается, цикл просто завершается, так как больше нечего обрабатывать.

Если вы хотите приостановить весь цикл, просто запустите его в среде subshell:

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

Единственная известная мне оболочка, которая способна приостановить весь цикл в текущей оболочке, это zsh.

jimmij
источник
4
Нет, Ctrl-Zможет просто приостановить один экземпляр преобразования, нет никаких причин, почему цикл не может продолжить и запустить другой. По какой-то причине bashостанавливает цикл. Когда тестирование в dashцикле продолжается, другие оболочки, вероятно, делают то же самое.
Грэм
6
@Graeme продолжение цикла с одной приостановленной итерацией кажется мне опасным, поскольку следующий шаг может зависеть от предыдущего. Единственное разумное решение для меня - это приостановить весь цикл, и это можно сделать в subshell (на самом деле zshон может приостановить весь цикл, работающий в текущей оболочке).
Джимми
3
Это, вероятно, ответ - bashразработчики, вероятно, были того же мнения, что и вы. Продолжение цикла - все еще то, что я ожидал, хотя, когда вы останавливаете процесс и передаете управление обратно в оболочку, кажется естественным для него выбрать, где он остановился (и, вероятно, это будет поведение, bashесли они не добавят код, чтобы сделать что-то еще).
Грэм