我正在使用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"
我觉得我错过了一些非常愚蠢的东西。当然,如果我不在后台运行这些函数,它们会显示正确的变量。 提前谢谢。
答案 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&