有人告诉我:
BASH 不是环境变量,而是 shell 变量
有什么不同?
答案1
环境变量在程序及其子程序中是全局可用的。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
答案2
$BASH
是局部变数这仅在当前(bash)shell 中有效。
环境变量诸如$SHELL
在系统范围内有效的。在当前 Bash shell 中,$BASH
指向狂欢,而$SHELL
指向定义为默认的 shell(可能具有相同的值)。
有关环境变量的解释,请参阅环境变量在 Ubuntu 帮助中。
答案3
它们是有区别的。Shell 变量和环境变量我会尽我所能解释得更好,但这里是其中的一段摘录:
如果对 shell 变量进行了更改,则必须将其明确“导出”到相应的环境变量,以便任何派生的子进程都能看到此更改。回想一下,shell 变量是定义它们的 shell 的本地变量。
答案4
要回答这个问题,首先尝试了解变量的范围。
当你创建一个新的变量时,就像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)。