命令行循环中的bg / fg

时间:2014-11-14 21:33:16

标签: bash jobs job-control

ctrl-z(^ z)在从终端执行的循环中完成后,我以不明白的方式行事。

说我输入

for ii in {0..100}; do echo $ii; sleep 1; done
然后我点击^ z。我会得到:

[1]+  Stopped                 sleep 1

我可以使用fg或bg恢复作业,但该作业仅指他的睡眠命令。循环的其余部分显然已经消失,终端上不再出现任何数字。

我可以用&在命令之后立即在后台运行它,或者另一个解决方案是将整个事物包装在子shell中:

( for ii in {0..100}; do echo $ii; sleep 1; done )

然后^ z给了我

[1]+  Stopped                 ( for ii in {0..100};
do
    echo $ii; sleep 1;
done )

这项工作可以恢复,每个人都很开心。但是,在执行一次性任务时,我通常不习惯这样做,我问的问题是为什么第一个行为首先发生。有没有办法暂停一个没有子shell的命令行循环?在第一个例子中,循环的其余部分发生了什么?

请注意,这特定于循环:

echo 1; sleep 5; echo 2

并在睡眠期间点击^ z导致echo 2执行:

1
^Z
[2]+  Stopped                 sleep 5
2

或者我应该养成使用& amp;并称之为黑魔法?

1 个答案:

答案 0 :(得分:5)

您无法暂停执行当前shell 。当您从命令行运行循环时,它将在您当前的登录shell /终端中执行。当您按[ctrl + z]时,您告诉shell暂停当前活动进程。你的循环只是当前shell中的一个计数器,正在执行的进程是sleep。暂停只能在睡眠时运行。

当您对某个流程进行后台处理或在子shell中执行它(大致相当)时,您可以暂停该单独流程。