【问题标题】:What do you do with Environment Variables?您如何处理环境变量?
【发布时间】:2009-03-24 01:55:52
【问题描述】:

当我执行envsetunset 等环境命令时,会发生一些事情,但是会发生什么?

set hello='hello world!'
unset find

您如何处理这些命令?这些变化是永久性的还是暂时的?在哪里可以看到变化?我是 Ubuntu 新手。

【问题讨论】:

  • 这里不适合这类问题,我想Ubuntu社区论坛会更好。
  • nineside 我尽量保持简单。请不要让标题迷惑你。我假设视角隐含地与编程相关。我想听听程序员对他们的看法。

标签: shell environment-variables


【解决方案1】:

这些更改是暂时的。它们只存在于当前的 shell 中。当您在~/.profile~/.bash_profile 中设置环境变量时(只需使用已经存在的环境变量,使用ls -a ~ 查看),它们将有效地永久存在,因为这些文件在您每次打开时都是“来源”的一个新的外壳。

例如,如果您添加:

export HELLO="world"

对于您的~/.profile,每次您打开一个新的 shell 时,该变量都会变得可用(您可以使用source ~/.profile 刷新当前的 shell)。您可以使用以下方法对其进行测试:

$ echo $HELLO
world

环境变量用于整个系统的脚本。您可以设置自己喜欢的编辑器,例如:

export EDITOR="nano"

您可以做的一件有用的事情是设置提示字符串,例如:

Bill:~$ export PS1="\u is awesome$ "
Bill is awesome$ ls
Bill is awesome$ du -h
Bill is awesome$ ...etc...

【讨论】:

    【解决方案2】:

    创建的每个进程都有自己的环境,该环境与进程一样长。您的 shell 就像任何其他进程一样。它的环境是它自己的。

    如果您键入不带参数的“set”,您将看到存在的内容。其中许多设置用于控制程序行为。您的搜索路径、所需的 X11 显示、主目录(如果不是 /home/yourname)等。

    用途真的是你需要的任何东西。每当您需要将一些有用的信息(例如某个程序的命令行选项的长列表)存储到其他应用程序可以读取或您可以从 shell 访问的变量中时,请使用环境。

    例如:

    USUAL_CONFIGURE_OPTS="--prefix=/home/charlie --sysconfdir=/home/charlie/tmp-etc"
    ./configure $USUAL_CONFIGURE_OPTS --and-additional-arguments
    

    编辑:

    作为一名程序员,我阅读环境来确定用户的偏好并服从他们。例如,如果设置了变量 POSIXLY_CORRECT,它会影响我的程序的输出。环境是用户告诉程序如何表现的地方。它也发生了,正如我上面所描述的,环境是用户存储有用位的一个方便的地方。

    再次(回应您的评论),每个执行的程序都是一个进程。一个进程拥有自己的地址空间(自己的内存),其环境存储在该空间中。这意味着,环境是特定于该进程的,并且仅与进程本身一样长。

    编辑 2:

    我想我现在完全理解你的问题了。如果有人说“虚拟环境”,他们只是注意到环境驻留在应用程序的地址空间中,该地址空间被内核映射为虚拟内存(有些页面可能在物理内存中,有些可能在交换中,共享动态对象,等)。

    除非进程显式创建到该特定区域的映射并与另一个进程共享,否则任何进程都不能访问另一个环境。同样,一个进程的地址空间是完全私有的并且与其他进程隔离。环境变量位于该地址空间内,否则进程无法访问或操作它们。

    【讨论】:

    • 我从 Unix Power Tools 了解到,您几乎可以考虑 Linux 文本中的所有内容。在后面的一章中,它补充说,这种说法并不完全正确。所以我对你对“过程”一词的使用感到困惑。进程可以发送信号,它们是文本,它们是如何真正定义的?
    • @UnixBasics,每个新创建的进程(正在运行的程序)在内存中都有自己的地址空间。它与任何其他过程完全隔离。进程 A 无法读取进程 B 的内存,除非明确设置了共享内存。每个进程的环境都是他们自己的。
    • @tinkertim 谢谢你的解释!当程序员谈到“虚拟”环境变量时,它们是什么意思?进程 A 在虚拟内存中有一个确切的位置,其他程序可以访问(但不能访问 A 的真实(?)内存)。 env.vars 是共享的还是只是 A 的虚拟 env.vars?
    • @UnixBasics,虚拟内存由许多东西组成,真实内存、交换等。分配给进程的内存可能存在于多个地方,但进程却没有注意到这一点。每个进程的内存都是私有的,除非该进程明确共享它。环境变量通常不共享。
    • 我很抱歉我的措辞不准确,例如“虚拟环境变量”。我只是指具有虚拟内存的进程的环境变量。这些定义仍然有效吗?
    【解决方案3】:

    与参数列表一样,为存储环境变量的进程分配了一段内存。我相信这是一个 \0 分隔的未排序的 KEY=VALUE 对列表。

    每个fork() 都会复制这部分内存,exec() 不会删除此内存,因此任何更改都会复制到子进程中。

    在使用export 之前,Unix shell 不会将变量写入此环境变量内存。这就是shell变量和环境变量的区别。

    在 bash shell 中,"x=2" 没有设置环境变量。 "export x=2""x=2; export x" 可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-10
      • 2019-09-29
      • 1970-01-01
      • 2022-01-10
      • 2017-02-21
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多