2010-06-19 58 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