环境变量 vs Shell 变量,有什么区别?

The*_*ent 63 command-line bash environment-variables

有人告诉我:

BASH 不是环境变量,而是 shell 变量

有什么不同?

Lek*_*eyn 52

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

澄清示例:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE
Run Code Online (Sandbox Code Playgroud)

  • @ChrisStryczynski `export` 确实为子进程设置了环境变量。您链接的帖子与此答案不矛盾,您能否澄清为什么您认为这是错误的? (4认同)

Tak*_*kat 41

$BASH是仅在当前 (bash) shell 中有效的局部变量

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

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

  • 这个答案不正确/不准确。环境变量不是全局/系统范围的。Shell 变量是*当前运行的* shell 的*私有*,并且它们不会导出(传递)到任何子进程。环境变量被导出到任何子进程。"MYVAR=private ; export OURVAR=shared ; printenv" 只会报告 "OURVAR",因为当 shell 执行 printenv 命令时,它会导出 OURVAR,而不是 MYVAR。 (19认同)
  • 一个很好的链接(+1):) (2认同)
  • +1 CM 的评论!我从未听过如此简单准确地解释差异!!!这个评论应该是答案。 (2认同)

Pet*_*r.O 9

它们是有区别的。Shell Variables 和 Environment Variables会尽我所能更好地解释它,但这里有一个摘录:

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

  • 另外您的链接不再有效! (3认同)