2013-10-14 62 views
3

如何并行运行一系列命令,并将其输出存储在变量中?bash:在后台运行多个命令,在变量中存储输出

我已经试过:

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 

如何运行序列在后台命令,并将其输出存储在变量中?

+1

'()'中的所有块都在背景上执行,所以一旦所有事情完成,您就会得到它的输出。因此,“睡眠”对你来说是“隐藏的”。 – fedorqui

+0

你真的想做什么?这个例子看起来是为了说明一个问题,这可能不是解决你真正问题的最好方法。 – chepner

+0

并行运行〜10个命令,等待终止,并分别处理其标准输出。 –

回答

5

manual

如果一个命令是由操作者控制终止‘&’,壳 异步执行该命令在一个子shell。这被称为 在后台执行该命令。该shell不会等待 该命令完成,并且返回状态为0(true)。

解决方法是将输出存储在文件中并从中读取。下面会为你工作:

tempout=$(mktemp) 
(echo -n "started "; sleep 2; echo "stopped") > "${tempout}" & 
echo "output before=$(<$tempout)" 
wait 
echo "output after=$(<$tempout)" 
+0

可能存在这里涉及的缓冲问题,当第一个'echo'被调用时,还没有任何东西可用于从'$ tempout'读取。根据处理器负载的不同,后台任务可能甚至不会在第一个“echo”之前启动。 – chepner

0

我想原因是此行的评价:即使你想要把整个命令在后台( output=`(echo -n "started "; sleep 2; echo "stopped") &` ,这导致返回码0,如devnull提到) - 但结果是未知的。并将值分配给$ output - 它必须等待原始命令退出。

没有在后台放置var分配。

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

相关问题