Answers:
$BASH
是一个局部变量,仅在当前(bash)shell中有效。
环境变量,例如在$SHELL
整个系统范围内都是有效的。在当前的Bash Shell中,$BASH
指向bash的执行路径,而$SHELL
指向定义为默认值(可能具有相同值)的Shell。
有关环境变量的说明,请参见Ubuntu帮助中的环境变量。
环境变量在程序及其子程序中是全局可用的。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/...
export
确实为子进程设置了环境变量。您链接的帖子与这个答案并不矛盾,您能否阐明为什么认为自己错了?
export
绝对设置环境变量
它们是有区别的。Shell变量和环境变量将尽我所能更好地进行解释,但以下是其中的摘录:
如果对shell变量进行了更改,则必须将其显式“导出”到相应的环境变量中,以便任何派生的子进程都能看到该更改。回想一下,shell变量对于定义它们的shell来说是局部的。
要回答此问题,请首先尝试了解变量的范围。
当您创建一个新变量时(例如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)。