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

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

在 Bash 中输入以下内容:

env | grep USER

set | grep USER

两次给出相同的用户名。

例如,在键入时我如何知道echo $USERshell 或环境变量是否已显示?

答案1

为了POSIX 兼容 shell(包括 Bash),该标准说:

2.5.3 Shell 变量
变量应从环境中初始化[...] 如果变量是从环境中初始化的,则应立即将其标记为导出;请参阅导出专用内置。可以通过变量赋值来定义和初始化新变量,[ETC。]

还有关于export

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

所以从 shell 的角度来看,只有变量。其中一些可能来自shell启动时的环境,其中一些可能导出到shell启动的进程的环境中。

(“环境”实际上只是进程启动时传递给进程的一堆字符串。当进程运行时,它可以用它做任何它喜欢的事情,使用它,忽略它,覆盖它。以及进程传递什么启动其他进程时可能是另一回事,不过当然通常只是再次传递所有环境变量。)


如果您使用一些非 POSIX shell,例如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

答案2

这些是同一个变量。与大多数其他编程语言不同,在 shell 中,环境变量和 shell 变量共享相同的名称空间。在 shell 中,环境变量是使用 .export 导出的 shell 变量export

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

答案3

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

相关内容