在for循环中恢复暂停的进程


13

我正在bash中运行:

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

Ctrl-Z在运行中,然后是fg其作业ID。但是其余的迭代不会继续完成。我想知道为什么?


2
我可以确认for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash版本4.2.53)
Hauke Laging 2014年

Answers:


11

Ctrl-Z暂停当前​​正在运行的进程。表达

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

除了所有的命令convert(即forindodone)是bash在当前shell中运行的关键字和外壳不能挂起自己(而不是你的意图无论如何)。因此,当您点击Ctrl-Z,并且命令convert挂起时,循环将简单地退出,因为不再需要处理任何内容。

如果您希望能够挂起整个循环,则只需在subshel​​l环境中运行它即可:

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

我知道的唯一能够在当前shell中挂起整个循环的shell是zsh


4
不,Ctrl-Z可以只是暂停一个转换实例,没有理由为什么循环无法继续并启动另一个。由于某种原因bash停止了循环。当我在dash循环中继续测试时,其他外壳可能也会执行相同的操作。
Graeme 2014年

6
@Graeme在暂停一次迭代的情况下继续循环对我来说似乎很危险,因为下一步可能取决于上一步。对我来说,唯一合理的解决方案是挂起整个循环,它可以在subshel​​l中完成(实际上zsh能够挂起在当前shell中运行的整个循环)。
jimmij 2014年

3
这可能就是答案- bash开发人员可能与您有相同的意见。继续循环仍然是我所期望的,当您停止进程并将控制权交还给Shell时,似乎很自然地选择了中断的位置(bash如果不添加它们,可能就是这种行为)代码以执行其他操作)。
Graeme 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.