环境变量和外壳变量之间的区别


8

据说环境变量是在子进程中继承的,而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

Answers:


9

您的第二个分配TEST="SHELL_TEST"不会取消导出变量。它仍然标记为“由孩子继承”。子级继承的值是父级中当前设置的值。
换句话说,您的第二个赋值不会将状态TEST转换为shell变量,根据该术语它仍然是环境变量。

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

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

$

嗨,垫子,谢谢您的回答。因此,我的理解(有两个名为TEST的变量,一个为环境变量,一个为shell变量,shell var TEST shadows env var TEST。)是不正确的,在Bash中只有一个变量,它始终是shell变量,并且可以设置为导出并充当环境变量。这是特定于Bash且依赖于实现的,还是在所有Shell中通用的。谢谢。
2012年

不确定“通用”,但至少与bash,ksh和zsh相同。
Mat

2
@ning这就是所有现代POSIX / Bourne样式的外壳(ash,ksh,bash,zsh)的工作方式。在Bourne Shell的古老版本中,更改导出的Shell变量不会更改环境中的值,但是您再也不会遇到它们。Csh的工作方式不同,您可能在老式环境中仍然遇到这种情况,但是一段时间以来它已经过时了。
吉尔斯(Gillles)“所以-别再作恶了”

@Gilles感谢您明确说明发生了什么以及原因。就像有人说的那样,每个Unix开发人员也应该是一个历史学家。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.