multithreading - bash中的简单后台进程问题

标签 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"

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

最佳答案

如果你真的需要这样做,一个黑客可以让你的函数打印出 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
}

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

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

关于multithreading - bash中的简单后台进程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6537231/

相关文章:

ruby - 运行线程数组的观察者

c++ - cpp中的UDP套接字永远循环

java - 使用Converting User thread -> Daemon thread

regex - 使用sed,正则表达式如何匹配汉字?

linux - 使用 "uniq -c"命令时需要从输出中删除计数

sql - AWK csv文件到sql文件输出

java - 多个请求的阻塞队列行为

linux - 检查密码linux用户

bash - 查找并打印列值重复 n 次的行

windows - 计划在 Windows 中运行 bash shell 脚本