引用此来源,
标准UNIX变量分为两类,环境变量和shell变量。广义上讲,shell变量仅适用于当前shell实例,并用于设置短期工作条件;环境变量具有更广泛的意义,在登录时设置的变量在会话期间有效。按照惯例,环境变量使用大写字母,而shell变量使用小写字母。
要列出所有环境变量,请使用printenv
命令,要列出所有shell变量,请使用set
命令。
您会注意到环境变量存储更长期的值,例如:
HOME=/home/adam
这个值相对稳定,很少改变,而shell变量存储本地、临时的、特定于shell的值,例如:
PWD=/tmp
每次更改当前目录时都会更改它。
对于大多数实际任务,通过在您的~/.bashrc文件中添加export VARIABLE_NAME=VALUE
来设置环境变量值。
对于Bash shell:
Shell变量与环境变量在不同方面有所不同:
♦ Shell变量仅适用于当前shell,并不会被子进程继承。例如,假设您从shell运行另一个应用程序,则该应用程序将不会继承shell变量:
$ SHELL_VAR=xyz
$ firefox
SHELL_VAR
将不会在子进程(firefox)的环境中可用。
♦ 相反,父进程(这里是shell)的环境变量将被所有子进程继承:
$ export SHELL_VAR=xyz
$ firefox
♦ Shell和环境变量都是在定义它们的Shell/进程中本地的:
环境变量可以持久化,而对于Shell变量,一旦你退出会话,它们就消失了。
注意:上面的示例只会改变你正在使用的Shell,在其他单独的Shell/Terminal中退出或重新启动后,你无法看到定义的变量,这符合进程本地性原则。
如何使Shell变量持久化:
一种方法是修改~/.profile文件:
export SHELL_VAR=xyz
此设置是用户特定的,而不是系统范围的。对于系统范围内的环境变量,您可以将上述行添加到/etc/profile.d中的.sh文件中。
我强烈建议阅读此页面:EnvironmentVariables
它们的差异类似于Java类中私有字段和受保护字段之间的差异。
Java类的私有字段仅可以从该Java类进行访问。Java类的受保护字段可以从该Java类及其子类进行访问。
Shell变量只能从该Shell进程中进行访问。由该Shell导出的环境变量可以从该Shell进程及从该Shell创建的子进程进行访问。
一个 shell 变量只是环境变量的一种特殊情况。 shell 变量从环境中继承,并根据使用的语法可能被复制到 shell 子进程的环境中: http://www.pixelbeat.org/docs/env.html
foo=bar
时,它会创建一个shell变量。当你执行export foo
时,它就成为了一个环境变量。 - Barmar