2016-08-13 37 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