如果我在本地重新定义以前导出的变量会发生什么?

时间:2014-03-04 15:12:03

标签: bash shell

假设我有一个名为foo1.sh的脚本执行此操作:

export FOO=something
./foo2.sh

还有一个像这样写的foo2.sh:

FOO=otherthings
echo $FOO

是否允许本地定义隐藏先前定义的全局变量?在foo2.sh中FOO会发生什么?

3 个答案:

答案 0 :(得分:1)

export一个shell变量意味着它被复制到新创建的子进程的环境中,包括子shell。

导出的变量与其他变量没有区别。副本(为子shell隐式导出)只是一个副本;它与父母或兄弟姐妹过程的环境没有任何关系。

答案 1 :(得分:1)

环境变量只是一个变量,其初始值从进程的父进程继承,其值被复制到任何子进程的环境中。否则,其值可能会像任何其他变量一样被更改。

答案 2 :(得分:1)

每个环境都会获得所有环境变量的完整副本。如果在子shell中重新定义环境变量,则将在该子shell和子shell生成的任何shell中重新定义它。但是,它不会影响父shell。

如果您的foo2.sh在运行调用脚本的单独子shell中运行,则重新定义内容不会影响初始脚本。而且,您执行foo2.sh的方式是以这种方式完成的。

如果你这样做了:

. ./foo2.sh

然后,foo2.sh在当前shell中运行,更改foo将影响调用shell的值$FOO

以下是一个例子:

foo.sh

export FOO="BAR"
echo "FOO = $FOO"
./foo2.sh
echo "FOO = $FOO"

foo2.sh

echo "In foo2: FOO = $FOO"
FOO="CHANGED!"
echo "In foo2: FOO = $FOO"

以下是执行foo.sh时发生的事情:

$ ./foo.sh
FOO = BAR
In foo2: FOO = BAR
In foo2: FOO = CHANGED!
FOO = BAR

请注意,一旦我们回到调用shell脚本中,$FOO将恢复为旧值。