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
之前启动。