假设我有一个名为foo1.sh的脚本执行此操作:
export FOO=something
./foo2.sh
还有一个像这样写的foo2.sh:
FOO=otherthings
echo $FOO
是否允许本地定义隐藏先前定义的全局变量?在foo2.sh中FOO
会发生什么?
答案 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
以下是一个例子:
export FOO="BAR"
echo "FOO = $FOO"
./foo2.sh
echo "FOO = $FOO"
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
将恢复为旧值。