shell和环境variables之间的区别

shell环境variables有什么区别? 这些variables在哪里存储?

引用这个来源 ,

标准UNIX变量分为两类,即环境变量和shell变量。 笼统地说,shell变量仅适用于shell的当前实例,并用于设置短期工作条件; 环境变量具有更深远的意义,登录时设置的会话在会话期间是有效的。 按照惯例,环境变量具有UPPER CASE,而shell变量具有小写名称。

要列出所有环境变量,请使用printenv并列出所有外壳变量,请使用set

你会注意到环境变量存储更多的永久值,例如:

 HOME=/home/adam 

哪些更改很少,而shell变量存储本地的,临时的,特定于shell的值,例如:

 PWD=/tmp 

每次更改当前目录时都会更改。

对于大多数实际的任务,通过向〜/ .bashrc文件添加export VARIABLE_NAME=VALUE来设置环境值。

它们的区别类似于Java类中私有字段和受保护字段之间的区别。

Java类的私有字段只能从该Java类访问。 Java类的受保护字段可以从Java类及其子类访问。

一个shell的shell变量只能从该shell进程访问。 从该shell导出的环境变量可以从该shell进程和从该shell创建的子进程中访问。

对于Bash shell:

Shell变量以不同的方式与环境变量不同:

♦外壳变量特定于外壳本身,不会被子进程继承。 例如,假设您正在从shell运行另一个应用程序,该应用程序将不会继承shell变量:

 $ SHELL_VAR=xyz $ firefox 

SHELL_VAR在子进程(firefox)的环境中将不可用。

♦相反,父进程的环境变量(这里的shell)被所有的子进程继承:

 $ export SHELL_VAR=xyz $ firefox 

♦shell和环境变量都是定义它们的shell / process的本地变量:

环境变量可以是持久的 ,而对于shell变量,一旦你退出会话,它们都不见了。

注意:上面的例子只会改变你正在使用的shell,换句话说,如果你注销或者启动一个新的shell /终端,你将不会看到你定义的变量,这是根据进程原则局部性。


如何使预设的shell变量:

一种方法是修改〜/ .profile文件:

 export SHELL_VAR=xyz 

此设置是用户特定的,而不是系统范围的,对于系统范围的环境变量,您可以将以上行添加到/etc/profile.d中.sh文件

我强烈推荐阅读这个页面: EnvironmentVariables

一个shell变量只是一个环境变量的特例。 shell变量是从环境继承的,并可能根据所使用的语法复制到shell的子级环境: http : //www.pixelbeat.org/docs/env.html