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

sha*_*ant 10 shell environment-variables

在 Bash 中键入以下内容:

env | grep USER
Run Code Online (Sandbox Code Playgroud)

set | grep USER
Run Code Online (Sandbox Code Playgroud)

给两次相同的用户名。

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

ilk*_*chu 14

对于POSIX 兼容的 shell(包括 Bash),标准说:

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

而关于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
Run Code Online (Sandbox Code Playgroud)