etu*_*rdu 3 unix bash process procfs
我想知道是否有办法从bash进程设置环境变量并从另一个进程读取它.
由于环境变量的值是进程的本地值(除继承之外),因此不能只export FOO="bar"
在终端中执行并从另一个终端读取它.然后我试图让他们通过/proc/environ
,但这是我得到的:
etuardu@subranu:~$ FOO="foo" bash
etuardu@subranu:~$ strings /proc/$$/environ | grep FOO
FOO=foo
etuardu@subranu:~$ export FOO="bar"
etuardu@subranu:~$ strings /proc/$$/environ | grep FOO
FOO=foo
etuardu@subranu:~$ echo $FOO
bar
Run Code Online (Sandbox Code Playgroud)
看来我可以在进程启动时获得该环境变量的值.
它的当前价值如何?
由于环境变量的工作方式,这通常是不可能的.
首次exec
编写进程时,内核会为其提供初始环境变量集以及其他一些内容(主要是其argv
向量,即其命令行).此后,此列表(如argv
向量)只是进程内的常规C字符指针数组.这个过程可以随意管理它们,包括完全回收存储字符串的内存以供其他用途使用.一个进程在任何其他进程的内存空间内窥视以查找其环境变量是不安全的.
大多数类型的过程确实使用内核或多或少原来的样子,也许它查询与C库函数修改它像提供的环境变量列表getenv()
和putenv()
.如果这些进程依次运行任何其他可执行文件,它们将相同的环境向量传递execve
给它们在自己执行开始时收到的系统调用,这意味着新的可执行文件获得相同的环境(可能通过某些调用增强putenv()
) .
贝壳是另一回事.由于环境变量在shell脚本中非常重要,因此一些shell仅将提供给它们的环境向量用作"起始值",然后忽略它.他们使用自己的,更强大的数据结构来管理他们的环境变量.当他们执行自己的子进程时,他们将一个全新的环境向量传递给新进程,从这些内部数据结构构建.这意味着即使您要查看shell的内存空间以查找上面建议的环境变量,您也只能找到初始集,而不是shell实际使用的环境!
您可以做的是查询进程的初始环境变量集,即在启动时传递给可执行文件的相同向量.但这不是便携式的,即使在支持此功能的操作系统中也存在相当大的差异.例如,在历史上的UNIX中,它仍然有点难看,因为它仍然涉及窥视进程的内存空间(尽管是一个称为"用户区"的特殊内存区域).Linux使这一点变得更加优雅:向量可以作为文本字符串找到/proc/<pid>/environ
.在大多数可以获取此信息的系统上,ps
都有一个e
能够显示它的选项.
归档时间: |
|
查看次数: |
960 次 |
最近记录: |