Відновіть призупинений процес у циклі 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призупиниться, цикл просто вийде, оскільки більше нічого обробляти.

Якщо ви хочете призупинити весь цикл, просто запустіть його в середовищі додаткової оболонки:

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

Єдина я знаю оболонку, яка здатна призупинити всю петлю в поточній оболонці zsh.


4
Ні, Ctrl-Zможе просто призупинити один екземпляр перетворення, і немає причини, чому цикл не міг продовжуватись і починати інший. Чомусь bashзупиняє цикл. Коли тестування в dashциклі триває, інші оболонки, ймовірно, роблять те ж саме.
Graeme

6
@Graeme продовження циклу з призупиненою ітерацією здається мені небезпечним, оскільки наступний крок може залежати від попереднього. Єдине розумне рішення для мене - призупинити весь цикл, і це могло б бути зроблено в нижній частині zshкорпусу (насправді він може призупинити весь цикл, що працює в поточній оболонці).
jimmij

3
Це, мабуть, відповідь - bashрозробники, ймовірно, мали таку саму думку, як і ви. Продовження циклу - це все-таки те, що я б очікував, хоча, коли ви зупините процес і повернете керування назад до оболонки, то, здається, природно, щоб він піднявся там, де він зупинився (і, мабуть, це буде поведінка, bashякби вони не додавали код зробити щось інше).
Graeme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.