2010-06-19 57 views
0

之間失去環境變量我有一個bash腳本如下:的Bash shell兩條線

rvm use 1.8.7 
rvm list 

第一行是定義一些環境變量,我的.bashrc文件中加載的功能。執行第二行時,這些變量已被設置爲其先前的值(設置值已丟失)。我在這裏錯過了什麼?

在Ubuntu的機器上運行。

+4

你能告訴我們更多關於'rvm'嗎?這裏的行爲至關重要。 – 2010-06-19 15:44:51

回答

2

正在創建一個子shell並在其中設置變量。當子shell退出時,更改將丟失。當while循環處於管道中時,通常會發生這種情況。沒有看到功能,就不可能比這更具體。

+0

你好丹尼斯, 這是函數的來源。任何建議? http://gist.github.com/449879 – 2010-06-23 12:53:14

+0

這不是一個函數,這是一個腳本,也沒有定義它的功能。但它確實設置了一些環境變量。如果你輸入該文件,它將把它們設置在當前環境中。但是,如果你運行它,它們將不會堅持到當前的環境中。除非變量在源文件的最後附近被輸出:'source $ rvm_scripts_path/rvm',否則當它在最後運行時,它們將不可用於此腳本/函數:'rvm $ *'。請顯示這樣定義的函數:'rvm(){...}'或'function rvm ...'。 – 2010-06-23 13:57:02

+0

丹尼斯你好, 對不起,那是我的錯誤。我認爲這是一個功能,因爲我在別的地方讀過它。代碼avoe在用戶登錄時源自bash_profile的rvm文件中。 登錄後,我們將CI服務器作爲「nohup java -war hudson.war」運行,此過程將調用「build.sh 「文件: rvm使用1.8.7 rvm列表 而這就是當第二行無法訪問從第一個設置的值。 – 2010-06-27 14:43:05

0

當你定義要提供給你需要的出口,像這樣的前綴所有子shell環境變量:

出口MYVAR =「一些價值」

我會檢查RVM做這正確

+0

但是子殼中的更改不會持續到父項。在Bash中試試這個:'a = 11;回聲嗨|同時閱讀b;做回聲「startloop [$ a] [$ b]」;一個= 22;回聲「裏面[$ a] [$ b]」;完成;回聲「外部[$ a] [$ b]」'。進入'while'的管道創建一個子shell。現在用'export'試試:'export a = 11; echo hi | while read b;做回聲「startloop [$ a] [$ b]」;一個= 22;回聲「裏面[$ a] [$ b]」;完成;回聲「外[$ a] [$ b]」' – 2010-06-19 16:41:35

+0

你可以避免這樣的子shell:'while ... done < 2010-06-19 16:44:22

+0

yes this是真的,你永遠不希望shell變量潛在地污染父shell。但是,如果您輸入rvm腳本,則在定義rvm函數時,rvm中定義的所有環境變量都將在父shelll – ennuikiller 2010-06-19 17:16:25