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

时间:2013-10-14 11:14:56

标签: 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 seconds pause>
output after=started stopped

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

2 个答案:

答案 0 :(得分:5)

来自manual

  

如果命令由控制操作符‘&’终止,那么shell   子shell中异步执行命令。这被称为   在后台执行命令。 shell不等待   要完成的命令,返回状态为0(true)。

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

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

答案 1 :(得分:0)

我认为原因是这条线的评价: output=`(echo -n "started "; sleep 2; echo "stopped") &` 即使您想将整个命令放在后台(这会导致返回代码0,如同提到的devnull) - 但结果未知。并为$ output赋值 - 它必须等待原始命令退出。

没有将var赋值放在后台。

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