环境变量与 Shell 变量有什么区别?

环境变量与 Shell 变量有什么区别?

有人告诉我:

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

相关内容