>假设我有一个名为 foo1.sh 的脚本来执行此操作:
export FOO=something
./foo2.sh
还有一个写成这样的 foo2.sh:
FOO=otherthings
echo $FOO
是否允许局部定义隐藏以前定义的全局变量?FOO
在 foo2.sh 会怎样?
每个环境都会获得所有环境变量的完整副本。如果在子外壳中重新定义环境变量,它将在该子外壳和子外壳生成的任何外壳中重新定义。但是,它不会影响父外壳。
如果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
就会恢复为其旧值。
export
shell变量意味着它被复制到新创建的子进程(包括子 shell)的环境中。
导出的变量在其他方面与任何其他变量没有什么不同。副本(为子壳隐式导出)只是一个副本;它与父进程或同级进程的环境无关。
环境变量只是一个变量,其初始值继承自进程的父进程,其值复制到任何子进程的环境中。否则,其值可能会像任何其他变量一样更改。