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

n-2*_*2r7 2 parallel-processing bash shell scripting multithreading

我正在使用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"
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 7

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

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

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


小智 7

如果你真的需要这样做,那么hack将是你的函数打印出bash代码,然后你可以以某种方式捕获并评估.

非常简单,最简单的方法就是让您的函数将代码输出到临时文件,然后在最后获取该文件.所以你会改变函数:

func1(){
    echo "var1=one"
}
Run Code Online (Sandbox Code Playgroud)

然后在最后做一些事情:

TEMPFILE=`mktemp`
func1 >> $TEMPFILE &
func2 >> $TEMPFILE &
func3 >> $TEMPFILE &
wait
source $TEMPFILE
rm $TEMPFILE
echo "$var1 $var2 $var3"
Run Code Online (Sandbox Code Playgroud)

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

export TEMPFILE=`mktemp`
func1(){
    echo "var1=one" >> $TEMPFILE
}
Run Code Online (Sandbox Code Playgroud)

别忘了删除临时文件......

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