环境变量和shell变量的区别

环境变量和shell变量的区别

据说环境变量是在子进程中继承的,但 shell 变量却不是。然而,以下测试显示 shell 变量在子进程中与环境变量一样可见。有什么不同?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST

答案1

您的第二个赋值TEST="SHELL_TEST"不会取消导出变量。它仍然被标记为“由子孙继承”。并且子进程继承的值是当前在父进程中设置的值。
换句话说,您的第二次赋值不会将 的状态恢复TEST为 shell 变量,根据该术语,它仍然是一个环境变量。

您必须取消导出它才能在子进程中取消设置:

$ typeset +x TEST
$ sh -c 'echo $TEST'

$

相关内容