【发布时间】:2010-07-27 07:07:27
【问题描述】:
shell和环境变量有什么区别? 这些变量存储在哪里?
【问题讨论】:
标签: linux bash shell unix environment-variables
shell和环境变量有什么区别? 这些变量存储在哪里?
【问题讨论】:
标签: linux bash shell unix environment-variables
引用this source,
标准 UNIX 变量分为 两大类,环境变量 和外壳变量。从广义上讲, shell 变量仅适用于 shell的当前实例并且是 用于设置短期工作 条件;环境变量有 更深远的意义,以及 登录时设置的对 会话的持续时间。经过 约定,环境变量有 UPPER CASE 和 shell 变量有 小写名称。
要列出所有环境变量,请使用printenv;要列出所有shell 变量,请使用set。
您会注意到环境变量存储了更多永久值,例如:
HOME=/home/adam
很少更改,而 shell 变量存储本地、临时、特定于 shell 的值,例如:
PWD=/tmp
每次更改当前目录时都会更改。
对于大多数实际任务,通过将export VARIABLE_NAME=VALUE 添加到您的 ~/.bashrc 文件来设置环境值。
【讨论】:
它们的区别类似于Java类中私有字段和保护字段的区别。
Java 类的私有字段只能从该 Java 类访问。 Java 类的受保护字段可以从该 Java 类及其子类访问。
shell 的 shell 变量只能从该 shell 进程访问。从该 shell 导出的环境变量可以从该 shell 进程和从该 shell 创建的子进程访问。
【讨论】:
对于 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/终端,您将看不到您定义的变量,这是根据进程局部性原则。
如何制作持久的shell变量:
一种方法是修改 ~/.profile 文件:
export SHELL_VAR=xyz
此设置是用户特定的而不是系统范围的,对于系统范围的环境变量,您可以将上述行添加到 /etc/profile.d 中的 .sh 文件中
我强烈推荐阅读这个页面:EnvironmentVariables
【讨论】:
shell 变量只是环境变量的一种特殊情况。 shell 变量是从环境继承的,并且可能根据使用的语法复制到 shell 子项的环境中: http://www.pixelbeat.org/docs/env.html
【讨论】: