【问题标题】:Difference between shell and environment variablesshell和环境变量的区别
【发布时间】:2010-07-27 07:07:27
【问题描述】:

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

【问题讨论】:

    标签: linux bash shell unix environment-variables


    【解决方案1】:

    引用this source

    标准 UNIX 变量分为 两大类,环境变量 和外壳变量。从广义上讲, shell 变量仅适用于 shell的当前实例并且是 用于设置短期工作 条件;环境变量有 更深远的意义,以及 登录时设置的对 会话的持续时间。经过 约定,环境变量有 UPPER CASE 和 shell 变量有 小写名称。

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

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

    HOME=/home/adam
    

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

    PWD=/tmp
    

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

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

    【讨论】:

    • 环境变量是用户定义的? & shell 变量是系统定义的吗?你也提到了这些命令,而不是我的意思是变量所在的位置???
    • “变量所在的位置”是什么意思?您在哪里设置它们的值,或者(技术上)存储在计算机内存中的哪里?
    • 任何文件都在其中存储&&它们是用户定义的还是预定义的
    • 当我们从调用输出的地方使用 set 或 env 命令时(我的意思是指定文件或内存是什么)
    • 要提供更规范正确的源代码,请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/… 的 POSIX 规范的 环境变量 部分。大写用于变量——无论是导出的还是其他的——可以修改 shell 和 POSIX 指定工具的行为;而小写应用于变量,包括环境变量,这些变量是应用程序定义的,不会修改 POSIX 指定的工具行为。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      对于 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 时自动读取的位置(即 ~/.profile)。导出的 shell 变量是相同的,只是它仅存在于易失性内存中,因此在重新启动时会丢失(断电等)。对吗?
      【解决方案4】:

      shell 变量只是环境变量的一种特殊情况。 shell 变量是从环境继承的,并且可能根据使用的语法复制到 shell 子项的环境中: http://www.pixelbeat.org/docs/env.html

      【讨论】:

      • 这是不正确的。你基本上把条款颠倒了。显然,这个话题有很多困惑,即使是资深用户和 coreutils 开发人员? :-/
      • 我认为我没有颠倒这些条款。我的意思是环境列表更基本,并且适用于包括 shell 在内的所有进程。 shell 变量是一种特殊情况,从环境列表初始化
      猜你喜欢
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2013-05-07
      • 2011-05-24
      • 2016-01-26
      • 1970-01-01
      相关资源
      最近更新 更多