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



>假设我有一个名为 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)的环境中。

导出的变量在其他方面与任何其他变量没有什么不同。副本(为子壳隐式导出)只是一个副本;它与父进程或同级进程的环境无关。

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

相关内容

  • 没有找到相关文章

最新更新