bash:在后台运行multiple命令,将输出存储在变量中

bash:在后台运行multiple命令,将输出存储在变量中,bash,background-process,Bash,Background Process,如何并行运行一系列命令,并将其输出存储在变量中 我试过: output=`(echo -n "started "; sleep 2; echo "stopped") &` echo "output before=$output" wait echo "output after=$output" 停顿了两秒钟,然后: output before=started stopped output after=started stopped 我期望: output before= <2

如何并行运行一系列命令,并将其输出存储在变量中

我试过:

output=`(echo -n "started "; sleep 2; echo "stopped") &`

echo "output before=$output"
wait
echo "output after=$output"
停顿了两秒钟,然后:

output before=started stopped
output after=started stopped
我期望:

output before=
<2 seconds pause>
output after=started stopped
之前的输出=
启动后输出=停止
如何在后台运行一系列命令,并将其输出存储在变量中?

来自:

如果命令由控制运算符
'&
终止,则shell 在子shell中异步执行命令。这被称为 在后台执行命令。壳不等待 命令完成,返回状态为0(true)

解决方法是将输出存储在文件中并从中读取。以下内容可能适用于您:

tempout=$(mktemp)
( echo -n "started "; sleep 2; echo "stopped" ) > "${tempout}" &
echo "output before=$(<$tempout)"
wait
echo "output after=$(<$tempout)"
tempout=$(mktemp)
(echo-n“已启动”;sleep 2;echo“已停止”)>“${tempout}”&

echo“output before=$(我认为原因是对这一行的评估:

输出=`(echo-n“已启动”;休眠2;echo“已停止”)&`
尽管您希望将整个命令放在后台(正如devnull所提到的,这将导致返回代码0),但结果未知。要将值赋给$output,它必须等待原始命令退出

您未将var分配置于后台


但是@devnull的解决方法仍然适用。您可以使用命名管道来代替文件。

()
中的所有块都在后台执行,因此在完成所有操作后,您将获得其输出。因此,
睡眠
是“隐藏的”"对你来说。你真正想做什么?这个例子似乎是为了说明一个问题,而这个问题可能不是解决你真正遇到的问题的最佳方法。并行运行~10个命令,等待终止,并分别处理它们的标准输出。这里可能涉及缓冲问题,其中还没有可用的内容可供读取
$tempout
调用第一个
echo
时。根据处理器负载的不同,后台任务甚至可能在第一个
echo
之前启动。