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;并称之为黑魔法?
答案 0 :(得分:5)
您无法暂停执行当前shell 。当您从命令行运行循环时,它将在您当前的登录shell /终端中执行。当您按[ctrl + z]时,您告诉shell暂停当前活动进程。你的循环只是当前shell中的一个计数器,正在执行的进程是sleep
。暂停只能在睡眠时运行。
当您对某个流程进行后台处理或在子shell中执行它(大致相当)时,您可以暂停该单独流程。