在bash脚本中,是否可以将后台进程计算的值赋给变量?

时间:2013-08-18 00:58:06

标签: bash file io

如果我有这样的脚本:

#!/bin/bash
echo `script2.sh` > temp.txt &
(wait for long enough time)
a=`cat temp.txt`
echo $a

一个值将由script2.sh成功更改。但是,如果我这样做:

#!/bin/bash
a=`script2.sh` &
(wait for long enough time)
echo $a

script2.sh不会更改a的值。我之所以这样做是因为:(1)我不希望主进程被script2.sh阻塞(在等待期间,我可以做其他事情)(2)我的主程序会做很多事情这样的东西,所以做很多文件IO会给我带来很大的开销,最好直接将值分配给内存中的变量。 我发现bash脚本中的文件IO非常慢。在我的程序中,执行400个这样的IO将花费大约10秒钟(当计算机正忙时)! 有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您无法将shell变量分配给尚不存在的值,因此您的方法根本无法实现。除了临时文件之外,我没有看到一个真实的选项,但你可以加快这个选项的速度。我很确定文件I / O不是很慢,而是你要创建一个子shell到echo脚本输出到文件,以及cat进程来读取文件。进程创建速度很慢,因此如果您希望速度最小化则很重要。您可以通过将shell的输出直接重定向到文件来避免创建echo子进程,并将cat进程替换为直接在shell中读取文件的bash的$(<file)惯用法。这就是我想出的:

#!/bin/bash
script2.sh >temp.txt &
# (wait for long enough time)
a=$(<temp.txt)
echo "$a"