shell和环境变量之间有什么区别? 这些变量存储在哪里?
答案 0 :(得分:21)
引用this source,
标准UNIX变量被拆分为 两类,环境变量 和shell变量。从广义上讲, shell变量仅适用于 shell的当前实例和 习惯于短期工作 条件;环境变量有 更深远的意义,和 登录时设置的有效 会议持续时间。通过 约定,环境变量有 UPPER CASE和shell变量都有 小写名称。
要列出所有环境变量,请使用printenv
并列出所有shell变量,使用set
。
您会注意到环境变量存储更多永久值,例如:
HOME=/home/adam
很少有变化,而shell变量存储本地,临时,特定于shell的值,例如:
PWD=/tmp
每次更改当前目录时都会更改。
对于大多数实际任务,通过将export VARIABLE_NAME=VALUE
添加到〜/ .bashrc文件来设置环境值。
答案 1 :(得分:9)
它们的区别类似于Java类中私有字段和受保护字段之间的区别。
只能从该Java类访问Java类的私有字段。可以从Java类及其子类访问Java类的受保护字段。
shell的shell变量只能从该shell进程访问。从该shell导出的环境变量可以从该shell进程和从该shell创建的子进程访问。
答案 2 :(得分:4)
对于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 /终端,您将不会看到您定义的变量,这是按流程局部性的原则。
如何制作presistent shell变量:
一种方法是修改〜/ .profile 文件:
export SHELL_VAR=xyz
此设置是特定于用户的,而不是系统范围的,对于系统范围的环境变量,您可以将以上行添加到 /etc/profile.d中的 .sh 文件中。
我强烈建议您阅读此页面:EnvironmentVariables
答案 3 :(得分:-1)
shell变量只是环境变量的一个特例。 shell变量是从环境继承的,可能根据使用的语法复制到shell的子环境中: http://www.pixelbeat.org/docs/env.html