gpt4 book ai didi

bash - bg/fg 在命令行循环中

转载 作者:行者123 更新时间:2023-11-29 09:00:34 24 4
gpt4 key购买 nike

ctrl-z (^z) 在从终端执行的循环中以我不理解的方式运行。

假设我输入

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

然后我点击 ^z。我会得到:

[1]+  Stopped                 sleep 1

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

我可以在命令后使用 & 立即在后台运行它,或者另一种解决方案是将整个东西包装在一个子 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 )

这份工作能复工,皆大欢喜。但在运行一次性任务时,我通常不习惯这样做,我要问的问题是为什么第一个行为首先发生。有没有一种方法可以挂起不是 subshel​​l 的命令行循环?第一个例子中循环的其余部分发生了什么?

请注意,这是特定于循环的:

echo 1; sleep 5; echo 2

并在 sleep 期间按 ^z 会导致 echo 2 执行:

1
^Z
[2]+ Stopped sleep 5
2

或者我应该养成使用 & 的习惯并将其称为黑魔法吗?

最佳答案

您不能暂停当前 shell 的执行。当您从命令行运行循环时,它会在您当前的登录 shell/终端中执行。当您按下 [ctrl+z] 时,您是在告诉 shell 挂起当前的事件进程。您的循环只是当前 shell 中的一个计数器,正在执行的进程是 sleep。挂起仅在 sleep 时运行。

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

关于bash - bg/fg 在命令行循环中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26939215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com