
是否有任何名稱空間(進程、使用者等)來隔離環境變數?
如果有的話,當你發生時會發生什麼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
另一個終端機視窗的會話中。