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