2010-03-26 56 views
0

我想使用groovy在UNIX上執行shell腳本,但我沒有任何運氣讓一個進程保留由另一個進程更改的環境變量。例如,java.lang.Process是否可以繼承另一個java.lang.Process的環境變量?

 
    def p1 = ["bash", "-c", "source /some/setEnv.sh"].execute() 

現在,我想要第二個進程p2繼承在p1中設置的環境變量。我怎樣才能做到這一點?我沒有看到java.lang.Process或其groovy擴展中的任何內容,這些擴展在執行該進程後會吐出環境變量。

回答

1

不需要。您需要從第一個進程執行第二個進程(即設置環境變量的進程)。

你有沒有想過

  1. 嵌入腳本設置ENV變量在第二個過程?
  2. 獲取第一個進程來設置環境變量,將其轉儲出來,讓Java進程讀取它們並設置變量,同時調用第二個進程(通過Runtime.exec)。
+0

另外,考慮創建一個臨時腳本文件,它嵌入你想運行的腳本並在bash中運行它。 –

1

如果你要得到一個shell腳本定義的環境veriables做這樣的事情:

def p = ["bash", "-c", "source /some/setEnv.sh ; somecmd /foo/bar"].execute() 

這將運行somecmd/some/setEnv.sh定義的環境變量。

一個更復雜的替代可能是:

  1. 運行bash -c source ; env從Java
  2. 解析上述的輸出,以提取有效的環境變量,把它們變成一個Java環境變量映射。
  3. 用新環境創建/運行您稱爲p2的過程。

明白,這是方式的結果,即UNIX/Linux下正常工作,不是Java API的缺點是很重要的。 UNIX/Linux認爲環境變量的「範圍」是一個OS級別的進程,並且一個進程無法讀取或設置另一個進程的環境變量。將環境變量狀態從一個進程轉移到另一個進程的唯一時間是創建子進程時。

+0

因爲我需要運行一系列取決於/some/setEnv.sh的unix命令,所以我認爲你的更復雜的選擇可能是最好的選擇。我想另一種方法是在Unix shell中運行/some/setEnv.sh,然後從同一個Unix shell進程中調用Groovy腳本。 –

+0

你最後的想法是最簡單/最好的IMO。 –

相關問題