是否有任何名称空间(进程、用户等)来隔离环境变量?
如果有的话,当你发生时会发生什么unshare
?他们会被克隆吗?如果流程更改现有变量会发生什么?
编辑:我正在使用Ubuntu
答案1
您不需要任何命名空间来隔离环境变量。它们对于每个进程来说已经是隔离的和私有的。修改子进程中的环境变量不会传播到其父进程。
Unix 中的环境变量只是存储在进程地址空间中的一堆字符串。当一个进程分叉时,它的子进程将“继承”它们的副本以及整个地址空间,并且当程序执行另一个程序(并替换地址空间的整个内容)时,它们必须作为参数显式传递envp
给系统execve(2)
调用(如果要保留它们)。
如果你想启动一个进程空的环境,您可以将其启动为
env - cmd ...
这只会调用execve("/path/to/cmd", ["cmd", ..., NULL], [NULL])
.
或者在仅包含以下内容的环境中运行它FOO=bar
:
env - FOO=bar cmd ...
clone(2)
影响系统调用 ( 、unshare(2)
、setns(2)
) 和命令行实用程序的命名空间unshare(1)
都不会以任何特殊方式考虑或影响环境。
注意:这是 Unix 中的工作原理,而不是某种自然法则。在其他系统上,例如 plan9(命名空间的概念起源于其中,但所有命名空间基本上都是山命名空间,因为一切都有一个文件/系统)环境只是默认安装的文件系统/env
,与 Unix 相反,共享默认情况下父母和孩子之间。
答案2
中的环境变量bash
仅作用于 shell 的特定实例,因此无需为它们定义单独的命名空间。
如果您同时打开两个终端窗口(在桌面环境中),您可以清楚地看到这一点。在其中之一创建一个新的环境变量,例如:
TEST_VAR=34
它不会出现在bash
另一个终端窗口的会话中。