
環境変数を分離する名前空間 (プロセス、ユーザーなど) はありますか?
ある場合、 すると何が起きますか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
シェルの特定のインスタンスにのみスコープされるため、それらに対して個別の名前空間を定義する必要はありません。
一度に 2 つのターミナル ウィンドウを開くと、このことがはっきりとわかります (デスクトップ環境)。そのうちの 1 つに新しい環境変数を作成します。例:
TEST_VAR=34
bash
他のターミナル ウィンドウのセッションには表示されません。