2016-08-13 63 views
2

我想同时运行函数f1f2,然后只在两者都完成时才执行动作。
看起来,如果函数像脚本一样后台运行,那么脚本不会看到值更改,直到循环不会终止并且最后一行不会执行。bash变量作用域与函数fork问题(&)

  1. 这应该如何实施?

编辑 - 附加功能所需
2.有没有一种方法,我可以读/写脚本主要工艺参数(不使用文件)?

谢谢您的阅读。

#!/bin/bash 

f1done="false" 
f2done="false" 

function f1 { 
    echo "f1: " 
    sleep 4 
    echo "f1 done." 
    f1done="true" 
} 

function f2 { 
    echo "f2: " 
    sleep 2 
    echo "f2 done." 
    f2done="true" 
} 

f1 & 
f2 & 

until [[ "$f1done" == "true" && "$f2done" == "true" ]]; do 
    echo "$f1done $f2done..."; 
    sleep 3; 
done 

echo "Both done." 
+3

事情是在单独的进程;它们的变化不会影响父进程。 –

+0

你正在寻找多线程和bash不支持。有一些Korn shell(ksh)支持多线程的讨论(http://kornshell.com/doc/faq.html Q7),但我不认为它发生了。除此之外,我不知道任何多线程的shell,你需要类似C,C++或Java的东西。 – cdarke

回答

4

f1f2将因此具有从主处理单独的地址空间独立的进程。因此你的循环将是无限的。

您需要改用wait。在后台运行

变化

until [[ "$f1done" == "true" && "$f2done" == "true" ]]; do 
    echo "$f1done $f2done..."; 
    sleep 3; 
done 

wait; 
wait; 
+0

谢谢埃德,等待声明很好地工作。请参阅我的问题了解其他要求。 – user1330734

+0

第二个'wait'是不必要的;在所有后台进程完成之前,没有参数的“wait”才会完成。 – chepner