Shell变量与环境变量,如果两者具有相同的名称,则首选哪一个?


10

在Bash中键入以下内容:

env | grep USER

set | grep USER

赋予两个时间相同的用户名。

我怎么知道,例如在键入时echo $USER是否已显示shell或环境变量?

Answers:


14

对于兼容POSIX的外壳(包括Bash),该标准规定:

2.5.3 Shell变量
应从环境中初始化变量[...] 如果从环境中初始化了变量,则应将其标记为立即导出;请参阅内置的导出特殊功能。可以使用变量分配来定义和初始化新变量,[等]

关于export

export name[=word]...
外壳程序应将export属性赋予与指定名称相对应的变量,这将使它们处于随后执行的命令的环境中。

因此,从外壳程序的角度来看,只有变量。其中一些可能来自启动Shell时的环境,而其中某些可能已导出到Shell启动的进程的环境中。

(“环境”实际上只是启动时传递给该过程的一串字符串。当该过程运行时,它可以执行所需的任何操作,使用它,忽略它,覆盖它。过程继续进行下去当启动其他进程时可能又是另一回事了,尽管通常将所有环境变量都重新传递。)


如果使用的是非POSIX外壳,例如csh,可能会有所不同:

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit

1
注意,像csh一样,Bourne shell从环境变量初始化shell变量。但是修改外壳变量不会影响相应的环境变量,除非您导出它们。那是Korn shell(由POSIX指定)破坏的东西。这就是为什么您应该谨慎使用现在使用的shell变量的名称,以确保您未修改可能会影响您在脚本中运行的命令的env变量。
斯特凡Chazelas

4

这些是相同的变量。与大多数其他编程语言相对,在外壳程序中,环境变量和外壳程序变量共享相同的名称空间。在外壳程序中,环境变量是已使用导出的外壳程序变量export

例如,请参见我对上一个问题的回答:“ shell变量和环境变量在用法上有什么区别?


我将重新阅读您的解释,只有在我了解您的答案之前,我需要先学习一些东西。
sharkant

@sharkant不用担心。如果我感到困惑,请告诉我,我会尽力澄清。ilkkachu的答案也很好。
库萨兰达

不,我不这么认为,您的解释风格很好,只是我所缺乏的知识无法珍惜他们。
sharkant

2

Shell变量只能用于当前的Shell,不能在系统范围内使用。另一方面,可以在系统范围内使用环境变量。按照惯例,Shell变量写为小写,而Environment Variable写为大写。您可以将shell变量用作环境变量,只需要将其导出即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.