Linux:环境变量存储在哪里?

94

如果我在终端输入以下命令:

export DISPLAY=:0.0

Shell 存储环境变量的位置在哪里?

我正在使用 Ubuntu 8.10。我查看了 ~/.profile 和 /etc/profile 文件,但是没有找到 DISPLAY 的任何踪迹。


2
在内存中的哪里:https://unix.stackexchange.com/questions/75939/where-is-the-environment-string-actual-stored/75951 - Ciro Santilli OurBigBook.com
7个回答

134
进程的环境变量是存在于运行时的,而不是存储在某个文件或其他位置。它们存储在进程自己的内存中(这就是它们被找到并传递给子进程的地方)。但是在 /proc/pid/environ 中有一个虚拟文件。
该文件显示了调用该进程时传递的所有环境变量(除非该进程覆盖了其内存的该部分 - 大多数程序都不会这样做)。内核通过该虚拟文件使它们可见。可以列出它们。例如,要查看进程 3940 的变量,可以执行以下操作:
cat /proc/3940/environ | tr '\0' '\n'

每个变量都由一个二进制零与下一个变量分隔开,tr 命令将这个零替换为换行符。


13
内核不会存储环境变量,它们会存储在用户模式下。如果环境块已重新分配,/proc/<pid>/environ 可能会返回错误的值。 - atomice
2
@atomice 我的印象是内核存储它们并使它们对用户程序可见,对用户程序可写。如果以定义的方式更改环境变量,environ文件是否代表错误的值?你能否展示一个利用这一点的程序? - Johannes Schaub - litb
18
内核将它们存储在用户空间的特定位置,这就是/proc/<pid>/environ所公开的内容。然而,如果你使用putenv或setenv在程序中修改环境,初始环境块可能会被重新分配(以容纳新变量)。新变量不会出现在/proc/<pid>/environ的输出中。 - atomice
2
@atomice 那么,新的更新环境将停留在哪里?有哪个命令可以显示它呢? - Antonio Rizzo
3
对于用户2284570的问题。关于环境变量在RAM中的位置,它们存储在main()函数栈的顶部。由setenv()等进行的任何动态修改都会被分配到其他地方。 - StndFish
显示剩余5条评论

46

输入set命令,将显示当前所有变量的列表。 如果想要变量持久保存,可以将其添加到~/.bashrc~/.bash_profile文件中(如果使用bash)。


16
如果您想要将环境变量用于整个系统,可以使用 /etc/environment 文件进行设置。

问题是关于在 RAM 中的具体位置。 - user2284570
11
请问在问题中有指明吗?你能否详细说明一下? - JohnnyQ
对于用户2284570的问题。关于环境变量在RAM中的位置,它们存储在main()函数的堆栈顶部。任何由setenv()等动态修改都会分配到其他地方。 - StndFish

11

它被存储在进程(shell)中,并且由于您已导出它,任何由该进程生成的进程都可以使用它。

以上操作不会像/etc/profile一样将其存储在文件系统中的任何位置。如果想要这样做,则必须显式地将其放入那里。


0

关于环境变量在RAM中的位置,它们存储在main()函数的堆栈顶部。任何由setenv()等动态修改的内容都会被分配到其他地方。


-1

有1个文件可用于存储环境变量。

.bashrc

您可以添加您的变量并使用它们。例如,我已将Django虚拟环境添加为环境变量,现在我可以在任何地方访问它。将此添加到您的bashrc文件中。

django_env='source/media/anish/Softwares/virtual_env/django2/bin/activate' 

现在您需要重新启动系统以反映更改,然后重新启动并输入$django_env来启动您的虚拟环境。就这么简单。


在任何现代*nix系统中,您可以设置环境变量的地方有很多(例如~/.profile/etc/environment等)。.bashrc(实际上是~/.bashrc)对于设置环境变量来说是一个非常糟糕的选择,因为它只被_bash_读取,并且仅在_interactive_和_non-login_ shell中读取。 - MestreLion

-8

那个变量并没有存储在某个脚本中。它只是由X服务器脚本设置的。您可以使用set命令检查当前设置的环境变量。


实际上,它是由 shell 为 X 客户端设置的。 - paxdiablo
当然,这是由启动X服务器的脚本设置的。 - Eduard - Gabriel Munteanu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接