![Shell 变量与环境变量,如果两者具有相同的名称,则首选哪一个?](https://linux22.com/image/111405/Shell%20%E5%8F%98%E9%87%8F%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%A4%E8%80%85%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E7%9A%84%E5%90%8D%E7%A7%B0%EF%BC%8C%E5%88%99%E9%A6%96%E9%80%89%E5%93%AA%E4%B8%80%E4%B8%AA%EF%BC%9F.png)
在 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 变量充当环境变量,只需将其导出即可。