Answers:
对于兼容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
Shell变量只能用于当前的Shell,不能在系统范围内使用。另一方面,可以在系统范围内使用环境变量。按照惯例,Shell变量写为小写,而Environment Variable写为大写。您可以将shell变量用作环境变量,只需要将其导出即可。