unshare 実行時の環境変数

unshare 実行時の環境変数

環境変数を分離する名前空間 (プロセス、ユーザーなど) はありますか?

ある場合、 すると何が起きますか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他のターミナル ウィンドウのセッションには表示されません。

関連情報