在bash中的简单背景过程问题

时间:2011-06-30 15:27:34

标签: multithreading bash shell scripting parallel-processing

我正在使用BASH,我正在调用几个更新几个变量的函数。这些功能需要很长时间才能完成,因此我在考虑在后台运行所有功能,以便它们可以同时运行。 这是我要问的基本例子。

#/bin/bash

func1()
{
    var1="one"

}

func2()
{
    var2="two"

}

func3()
{
    var3="three"

}

echo "Right now this is what i am doing"
func1 &
func2 &
func3 &
wait
echo "The variables are $var1 $var2 $var3"
echo "But the variables are empty. 
echo "Hence, I am assuming that they are not accessible outside of the function"

我觉得我错过了一些非常愚蠢的东西。当然,如果我不在后台运行这些函数,它们会显示正确的变量。 提前谢谢。

3 个答案:

答案 0 :(得分:7)

如果您在后台运行某些内容,它将作为单独的子进程运行,并具有自己的环境。

它不会影响当前进程的环境(这些子shell的父进程)。

因此,变量在函数之外不可用,因为它们在进程外部不可用。该函数是无关紧要的,因为如果你在前台运行它们(没有&),变量设置得很好。

答案 1 :(得分:7)

如果你真的需要这样做,黑客就是让你的函数打印出bash代码,然后你可以以某种方式捕获并评估。

非常确定最简单的方法是让您的函数将代码输出到临时文件,然后在最后获取该文件。因此,您可以将功能更改为:

func1(){
    echo "var1=one"
}

然后在最后做类似的事情:

TEMPFILE=`mktemp`
func1 >> $TEMPFILE &
func2 >> $TEMPFILE &
func3 >> $TEMPFILE &
wait
source $TEMPFILE
rm $TEMPFILE
echo "$var1 $var2 $var3"

如果函数本身是打印输出,那么您可能需要执行某些操作,例如导出包含临时文件名称的变量,然后在函数中进行重定向,即:

export TEMPFILE=`mktemp`
func1(){
    echo "var1=one" >> $TEMPFILE
}

不要忘记删除临时文件...

注意:可能有更好的方法。

答案 2 :(得分:0)

嗯试试这个:

首先,使用var3="value"而不是echo -n value > .var3,然后将值写入文件。名称前面的点将使其“隐藏”,-n会在其后面添加换行符停止回显。

然后在最后,而不是echo "values are $var1 $var2 $var3"echo "values are $(cat .var1) $(cat .var2) $(cat .var3)"cat命令将文件内容打印到标准输出。

= - )

P.S。您也可以使用“命名管道”。使用mkfifo创建命名管道。但有一件事,当你回显一个命名管道时,你必须把它作为一个工作开始,否则你的脚本会挂起,直到你读到内容[用cat]。所以:echo val > .named_pipe&