2013-10-08 237 views
1

我有兩個shell腳本。在其中的一個,我有:環境變量不更新

export FOO="yes" 
sh another.sh & 

# ops ... 

export FOO=0 

another.sh我:

while [[ $FOO -eq "yes" ]] 
do 
# something ... 
done 

的事情是,當第一個腳本完成後,設置FOO=0FOOanother.sh值繼續導"yes"。我想知道如何獲得更新的FOO,這樣我就可以知道第一個腳本(調用者)何時完成。

+2

一般而言,您*不能*將環境變量從一個正在運行的shell導出到另一個運行的shell。建議:對於兩個獨立的shell腳本,請使用命名管道:http://www.linuxjournal.com/content/using-named-pipes-fifos-bash。在這種特殊情況下,你可以通過用'來代替父變量。 another.sh&'(「。」而不是「sh」)。 – paulsm4

+1

變量值在腳本啓動時設置,然後不能從外部更改。你需要一些其他的共享數據的外部方法,比如某個文件。 –

回答

2

子進程接收其父環境的副本,而不是對原始引用的引用。如果父級在孩子仍在運行時發生更改,則孩子的內存空間中仍然具有原始值。

作爲一種解決方法,您可以讓父級在退出前在已知位置創建一個空文件,並讓子級查找要創建的文件。它不是很健壯,但它是一種簡單的進程間通信形式,可能就足夠了。

+0

我之前想過這樣做,但不喜歡創建文件的想法。但最終我用這個方法來實現我的目標。 –

1

這是不可能的:對父級環境的更改不會傳遞給子級進程。

您是否考慮過顛倒父母和子女關係?如果孩子正在等待父母完成,爲什麼不從什麼是子腳本中調用父母腳本?假設你的第一個腳本被稱爲 「first.sh」,像

another.sh:

sh first.sh & 
CHILDPID=$! 

while ! (ps -p $CHILDPID | grep $CHILDPID) 
do 
[...] 
done 

使用作業控制(在bash使用set -m)可能是另一種解決方案。

+0

+1,但我不想改變父母/子女的關係。 –

0

管道輸送`而讀」循環開始殼層 嘗試使用,而不是 東西像其他循環機制:

同時讀取文件名 做 ......... 做< <(LS -1tr $ SOURCE_DIR)