shell和环境变量之间的区别

sun*_*nil 24 unix linux bash shell environment-variables

shell和环境变量之间有什么区别?这些变量存储在哪里?

Ada*_*tan 22

引用此来源,

标准UNIX变量分为两类,环境变量和shell变量.从广义上讲,shell变量仅适用于shell的当前实例,用于设置短期工作条件; 环境变量具有更深远的意义,登录时设置的那些变量在会话期间有效.按照惯例,环境变量具有UPPER CASE,而shell变量具有小写名称.

要列出所有环境变量,请使用printenv和列出所有shell变量,使用set.

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

HOME=/home/adam
Run Code Online (Sandbox Code Playgroud)

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

PWD=/tmp
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您引用了“按照惯例,环境变量具有大写字母,而 shell 变量具有小写名称。”,但您向我们展示了大写字母用于 shell 和环境变量。 (2认同)
  • 要提供更规范的正确源,请参阅 POSIX 规范的“环境变量”部分,网址为 https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html。大写用于变量——无论是导出的还是其他的——可以修改 shell 和 POSIX 指定工具的行为;而小写字母应用于变量,**包括环境变量**,这些变量是应用程序定义的,并且不会修改 POSIX 指定的工具行为。 (2认同)

dir*_*obs 11

对于 Bash 外壳:

Shell 变量与环境变量的不同之处在于:

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

$ SHELL_VAR=xyz
$ firefox
Run Code Online (Sandbox Code Playgroud)

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

? 相比之下,父进程(这里是shell)的环境变量被所有子进程继承:

$ export SHELL_VAR=xyz
$ firefox
Run Code Online (Sandbox Code Playgroud)

? shell 和环境变量都是定义它们的 shell/进程的本地变量:

环境变量可以是持久的,而对于 shell 变量,一旦您退出会话,它们就会全部消失。

注意:以上示例仅更改您正在处理的 shell,换句话说,如果您注销或启动一个新的 shell/终端,您将看不到您定义的变量,这是按照流程原则地点。


如何制作持久化的 shell 变量:

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

export SHELL_VAR=xyz
Run Code Online (Sandbox Code Playgroud)

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

我强烈建议阅读此页面:EnvironmentVariables


twi*_*imo 10

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

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

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