在 Bash 中输入以下内容:
env | grep USER
和
set | grep USER
两次给出相同的用户名。
例如,在键入时我如何知道echo $USER
shell 或环境变量是否已显示?
答案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 变量充当环境变量,只需将其导出即可。