execコマンドを実行すると、呼び出しシェルの環境変数は保存されますか?では、なぜそうなのでしょうか?

execコマンドを実行すると、呼び出しシェルの環境変数は保存されますか?では、なぜそうなのでしょうか?

私が知る限り注文の実行シェルプログラム呼び出しを次に置き換えます。注文する子プロセスを分岐する必要はありません。また、私が正しく理解した場合、エクスポートされた変数は生成された子孫に渡される変数です。しかし、なぜあなたはいつ注文の実行、コマンドが呼び出しシェルから変数を継承し続けるのはなぜですか?

この状況(Bashで実行)を説明するための例は次のとおりです。

$ cat vartest1
x=50
y=1
export y
exec ./vartest2

$ cat vartest2
echo x = $x
echo y = $y

$ ./vartest1
x =
y = 1

なぜバーテスト2エクスポートした変数の継承バーテスト1しかし、ローカルではない場合バーテスト2子プロセスではありませんバーテスト1走るとき実装する

ベストアンサー1

Unixはスポーンを使わずにフォークを使います。 Forkは通常、execの直前にプロセス(子プロセスの非常に短い違いのリストを含む)を複製します。 (コメントで述べたように..)execシステムコールは、環境変数が新しいプロセスに渡される場所です。親はデフォルトで、新しい実行可能ファイルに独自の環境を使用するか、まったく異なるものを渡すことができます。

Bash(およびおそらく他のシェル)では、コマンドの-cオプションはexec環境を消去します。環境変数は、variable=valueコマンドラインからexecの前に配置することで一般的な方法で変更することもできます。これらの操作のいずれも実行されない場合、新しい実行可能ファイルはシェルの内容を継承します。

fork() は子プロセスではほとんど変更しませんが、 exec() は多くの変更を行います。例えば、信号ハンドラがリセットされる。開かれたファイルハンドルは、新しい実行可能ファイルがハンドルを取得できないようにexecで閉じたものとしてマークすることができます。メモリマッピングが最初からやり直されました。環境変数などのものはセットに継承または置き換えることができます。

したがって、forkとexecが実行する操作の前提は実際の使用法とは多少相反します。ここでのアイデアは、新しいプロセスを作成するためにfork()がよく使用され、そのプロセスのメモリがすべて新しい実行可能ファイルに捨てられるため、変更または動作するように設定する必要がないことです。分岐後に実行中のプログラムは、同じメモリを使い続けるか(通常は書き込み時にコピーに設定され、必要に応じてメモリページを機会的に複製する)、exec()を使用してメモリを新しいプログラムに完全に置き換えることによって、で分離できます。親プログラムで共有メモリページがリンクされており、変更はありません。環境変数は、exec()を呼び出した後に保持できる(必ずしもそうではありません)、いくつかの変数の1つです。

おすすめ記事