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

有人告诉我:

BASH不是环境变量,它是一个shell变量

有什么不同?

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

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

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

环境变量是全局可用的,在程序和子程序中。 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 

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

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

它们是有区别的。 Shell变量和环境变量将更好地解释它,但这里有一个摘录:

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

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

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

按照惯例,Shell变量的名称为小写,而Envn。 变量写为大写

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

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

当您导出该变量(如export SOME_ENV_VARIABLE ,该变量现在在环境范围内可用,这意味着在该实例如果更改了shell,您仍然可以访问该变量。 让我们尝试通过以下示例来理解:

 [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)。