外壳变量
Shell变量是范围在当前Shell会话中的变量,例如在交互式Shell会话或脚本中。
您可以通过为未使用的名称分配值来创建shell变量:
var="hello"
Shell变量的使用是为了跟踪当前会话中的数据。Shell变量通常使用小写字母的名称。
环境变量
环境变量是已导出的外壳程序变量。这意味着它将不仅作为创建它的shell会话中的变量,而且对于从该会话启动的任何进程(不仅是shell)都可见。
VAR="hello" # shell variable created
export VAR # variable now part of the environment
要么
export VAR="hello"
导出外壳变量后,它将一直保持导出状态,直到未设置它或删除其“导出属性”(带有export -n
in bash
),因此通常无需重新导出它。使用取消设置变量unset
会删除它(无论它是否是环境变量)。
bash
不能将数组和关联散列以及其他外壳中的内容导出为环境变量。环境变量必须是简单变量,其值是字符串,并且它们的名称通常由大写字母组成。
使用环境变量不仅可以跟踪当前Shell会话中的数据,还可以使任何启动的进程都可以使用该数据。这种情况的典型情况是PATH
环境变量,可以在外壳程序中设置环境变量,以后任何想要启动程序而无需指定它们完整路径的程序都可以使用它。
流程中的环境变量的集合通常称为“流程环境”。每个过程都有其自己的环境。
环境变量只能被“转发”,即子进程永远不能在其父进程中更改环境变量,除了在启动子进程时为其设置环境之外,父进程可能不会更改子进程的现有环境。子进程。
环境变量可以列出env
(不带任何参数)。除此之外,它们在Shell会话中看起来与未导出的Shell变量相同。这对于shell来说有点特殊,因为大多数其他编程语言通常不会将“普通”变量与环境变量混合在一起(请参见下文)。
env
还可用于在流程环境中设置一个或多个环境变量的值,而无需在当前会话中进行设置:
env CC=clang CXX=clang++ make
这将启动make
与环境变量CC
设置为值clang
和CXX
设置为clang++
。
它也可以用于清除流程的环境:
env -i bash
这会开始,bash
但不会将当前环境转移到新bash
进程中(它将仍然具有从其外壳初始化脚本中创建新环境变量环境变量)。
差异示例
$ var="hello" # create shell variable "var"
$ bash # start _new_ bash session
$ echo "$var" # no output
$ exit # back to original shell session
$ echo "$var" # "hello" is outputted
$ unset var # remove variable
$ export VAR="hello" # create environment variable "VAR"
$ bash
$ echo "$VAR" # "hello" is outputted since it's exported
$ exit # back to original shell session
$ unset VAR # remove variable
$ ( export VAR="hello"; echo "$VAR" ) # set env. var "VAR" to "hello" in subshell and echo it
$ echo "$VAR" # no output since a subshell has its own environment
其他语言
大多数编程语言中都有库函数,这些函数允许获取和设置环境变量。请注意,由于环境变量是作为简单的键值关系存储的,因此它们通常不是语言的“变量”。程序可以获取与键(环境变量的名称)相对应的值(始终是字符串),但随后必须将其转换为整数或语言期望该值具有的任何数据类型。
在C,环境变量可以使用访问getenv()
,setenv()
,putenv()
和unsetenv()
。C程序启动的任何进程都以相同的方式继承用这些例程创建的变量。
其他语言可能具有用于完成同一任务的特殊数据结构,例如%ENV
Perl中的哈希,或ENVIRON
大多数实现中的关联数组awk
。