Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bashshell在两行之间丢失环境变量_Bash_Variables_Environment - Fatal编程技术网

bashshell在两行之间丢失环境变量

bashshell在两行之间丢失环境变量,bash,variables,environment,Bash,Variables,Environment,我有一个bash脚本,如下所示: rvm use 1.8.7 rvm list 第一行是在my.bashrc文件中加载的函数,它定义了一些环境变量。执行第二行时,这些变量已设置为其先前的值(设置的值已丢失)。我错过了什么 运行在ubuntu框上。正在创建子shell,并在其中设置变量。当子shell退出时,更改将丢失。这通常发生在while循环位于管道中时。如果看不到函数,就不可能比这更具体。当您定义要对所有子shell可用的环境变量时,您需要在其前面加上export,如下所示: export

我有一个bash脚本,如下所示:

rvm use 1.8.7
rvm list
第一行是在my.bashrc文件中加载的函数,它定义了一些环境变量。执行第二行时,这些变量已设置为其先前的值(设置的值已丢失)。我错过了什么


运行在ubuntu框上。

正在创建子shell,并在其中设置变量。当子shell退出时,更改将丢失。这通常发生在
while
循环位于管道中时。如果看不到函数,就不可能比这更具体。

当您定义要对所有子shell可用的环境变量时,您需要在其前面加上export,如下所示:

export myvar=“某些值”


我会检查rvm是否正确执行此操作

您能告诉我们有关
rvm
的更多信息吗?它的行为在这里是至关重要的。但是子shell的变化不会持续到父级。在Bash中试试这个:
a=11;读取b时回显hi |;重复“惊跳[$a][$b]”;a=22;回声“内部[$a][$b]”;完成;回显“外部[$a][$b]”
。进入
的管道将创建子shell。现在使用
export
export a=11;读取b时回显hi |;重复“惊跳[$a][$b]”;a=22;回声“内部[$a][$b]”;完成;echo“外部[$a][$b]”
您可以避免这样的子shell:
而。。。done<是这是真的,您永远不希望shell变量可能污染父shell。但是,如果您为rvm脚本提供源代码,那么在定义rvm函数时,rvm中定义的所有环境变量都将在父外壳中可用,而实际上它是“source.rvm/bin/rvm”。但调用rvm只是rvm。。。我应该使用源rvm吗?你好,丹尼斯,这是函数的源代码。有什么建议吗?那不是一个函数,那是一个脚本,里面也没有定义函数。不过,它确实设置了一些环境变量。如果您
source
该文件,它将在当前环境中设置它们。但是,如果改为运行它,它们将不会持续存在到当前环境中。除非在靠近末尾时在此文件中导出变量:
source$rvm\u scripts\u path/rvm
,否则当此脚本/函数正好在末尾运行时:
rvm$*
将无法使用这些变量。请显示如下定义的函数:
rvm(){…}
函数rvm…
。您好,丹尼斯,很抱歉,当时是我的错误。我认为这是一个函数,因为我在别的地方读过它。代码avoe位于rvm文件中,当用户登录时,该文件来源于bash_概要文件。登录后,我们以“nohupjava-warhudson.war”的形式运行CI服务器,该过程将调用“build.sh”文件:rvm使用1.8.7 rvm list,此时第二行无法访问第一行中设置的值。@Guillerme:问题中脚本中的每个调用都是一个独立的子shell,因此变量不会从一个持续到下一个。看起来您可以在其中一个rvmrc文件中设置某些内容,或者可以将上面的第一行更改为
rvm use 1.8.7
。但这一切都取决于您发布到github的文件中的源文件
source$rvm\u scripts\u path/rvm
。到目前为止,在您发布的内容中,我没有看到任何内容被导出,因此这些脚本的子脚本也没有可用的内容(请记住,除非文件来源,否则它设置的变量……对父脚本或其后续子脚本不可用)。