gpt4 book ai didi

linux - 如何在一行中收集在 bash for 循环中启动的后台进程 PID 列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:38 24 4
gpt4 key购买 nike

下面的 bash 脚本在一个循环中 fork 几个进程,沿途收集它们所有的 PID,然后等待它们全部完成:

PIDS=''
for i in $(seq 1 3); do
./longRunningProcess &
PIDS=$PIDS' '$!
done

wait $PIDS

在 bash 中逐行输入时效果很好,但我想在一行上执行此 for 循环,我认为应该如下所示:

for i in $(seq 1 3); do ./longRunningProcess & PIDS=$PIDS' '$!; done

但是当我尝试执行此操作时,我得到:

-bash: !: event not found

似乎 bash 以某种方式解释了 !作为命令历史扩展,但我认为前面的 $ 会将其解释更改为最后一个 fork 的后台进程的 PID。

我想了解:

  1. 为什么 bash 以这种方式解释 !
  2. 正确的写法是什么,为什么

谢谢!

最佳答案

历史扩展是愚蠢的。

问题不在于单行,而是历史扩展被启用(主要)。

在您的交互式 shell 中禁用历史扩展将使这项工作成功。

将单行放在脚本中(默认情况下禁用历史扩展)也可以。

历史扩展和单行结合导致扩展被尝试和爆炸。

在 shell 中的多行上执行此操作也会失败(如果您保持分号完好无损......稍后会详细介绍)。

History Expansion bash 引用手册的一部分解释了如何扫描命令行以进行历史扩展,如下所示:

History expansions are introduced by the appearance of the history expansion character, which is ‘!’ by default. Only ‘\’ and ‘'’ may be used to escape the history expansion character.

bash man page添加(我不确定为什么引用手册没有这样说):

Several characters inhibit history expansion if found immediately following the history expansion character, even if it is unquoted: space, tab, newline, carriage return, and =. If the extglob shell option is enabled, ( will also inhibit expansion.

所以添加一个空格/等等。在该单行版本中的 ! 之后应该可以工作。

关于linux - 如何在一行中收集在 bash for 循环中启动的后台进程 PID 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30788835/

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