环境变量与Shell变量有什么区别?


Answers:


35

$BASH是一个局部变量,仅在当前(bash)shell中有效。

环境变量,例如在$SHELL整个系统范围内都是有效的。在当前的Bash Shell中,$BASH指向bash的执行路径,而$SHELL指向定义为默认值(可能具有相同值)的Shell。

有关环境变量的说明,请参见Ubuntu帮助中的环境变量


1
很棒的链接(+1):)
Peter.O 2011年

12
该答案不正确/不正确。环境变量不是全局/系统范围的。shell变量是私人当前运行的外壳,它们不会被导出(传递)到所有的子进程。环境变量将导出到任何子进程。“ MYVAR = private;导出OURVAR = shared; printenv”将仅报告“ OURVAR”,因为当外壳程序执行printenv命令时,它将导出OURVAR,而不会导出MYVAR。
CM

2
+1 CM的评论!我从未听说过如此简单而准确地解释过差异!!!这个评论应该是答案。
Jesse the Wind Wanderer

48

环境变量在程序及其子程序中是全局可用的。shell变量仅在当前shell中可用。要将shell变量用作环境变量,请使用export VARNAME(不带dollar $)。

澄清示例:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

定义环境变量的另一种方法:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE

我认为这是不正确的。export不一定设置环境变量。stackoverflow.com/questions/7411455/...
克里斯Stryczynski

3
@ChrisStryczynski export确实为子进程设置了环境变量。您链接的帖子与这个答案并不矛盾,您能否阐明为什么认为自己错了?
Lekensteyn

export绝对设置环境变量
David Tonhofer

8

它们是有区别的。Shell变量和环境变量将尽我所能更好地进行解释,但以下是其中的摘录:

如果对shell变量进行了更改,则必须将其显式“导出”到相应的环境变量中,以便任何派生的子进程都能看到该更改。回想一下,shell变量对于定义它们的shell来说是局部的。


我正在评论自己的答案。我真的很喜欢Takkat答案中的“ 帮助Ubuntu”链接...(比我的要好)
Peter.O 2011年

3
另外,您的链接不再有效!

1

Shell变量:短期,仅适用于Shell的当前实例,不适用于系统范围

环境变量:长期使用,有效的系统范围,全球允许

按照约定,Shell变量在Envn中的名称为小写。变量写为大写


-1

要回答此问题,请首先尝试了解变量的范围。

当您创建一个新变量时(例如SOME_ENV_VARIABLE="testing.txt"它驻留在中)SHELL scope,这意味着可以由用户登录的shell实例访问该变量。例如,在实例更改时,您打开新终端或更改Shell(例如,切换到csh),则无法访问该变量。

当您导出该变量时,就像export SOME_ENV_VARIABLE该变量现在在环境范围内可用一样,这意味着在这种情况下,如果更改外壳程序,您仍然可以访问该变量。让我们尝试通过以下示例来理解:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

打个比方:假设您有一个两居室公寓,并且正在与另一个室友共享。公共区域可以由任何人访问,但您的卧室不能访问,环境变量就像公共区域,而shell变量就像卧室,如果您在公共区域中访问某些东西,任何人都可以访问,但是如果您将其保存在卧室中,则只能访问被您访问。

请记住,如果打开一个新终端,您将无法访问任何变量,因为您正在更改该实例。为此,您应该在.profile或中添加变量.bashrc(如果使用bash)。

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.