环境变量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)。