シェルがコマンドを実行するサブプロセスを生成する前または後に一時的な環境変数が追加されますか?

シェルがコマンドを実行するサブプロセスを生成する前または後に一時的な環境変数が追加されますか?

Bashで実行するとき

myvar=val mycommand myargs

myvar=val実行環境に追加されますmycommand

bashプロセス呼び出しがfork()実行するサブプロセスmycommand、つまりmycommand外部実行可能ファイルまたはスクリプトファイルを生成するとします。

myvar=valbashシェル呼び出しの前後にいつ環境に追加されますかfork()?つまり、次の2つの可能性のうち実際に発生したものは何ですか?

  • Bashプロセスは、myvar=val 独自の環境に追加され、実行を呼び出し、Bashプロセス環境の一部として子プロセス環境に継承されるfork()子プロセスを作成するために呼び出されます。子プロセスが実行を完了して終了すると、bashプロセスは自分の環境で終了します。execve()mycommandmyvar=valmycommandmyvar=val

  • bashプロセス呼び出しは、fork()実行するサブプロセスを作成し、mycommandそのサブプロセスをmyvar=val独自の環境に追加してからexecve()実行を呼び出しますmycommand

私の質問の動機は次のとおりです。私の以前の投稿に対するStephenの答え

Bashは、_コマンドを解析するたびに最後のパラメータの値に設定される特別なパラメータです。また、コマンドが実行されるたびに適用されるエクスポートできない特殊属性もあります(参照:bind_lastargBashのソースコードから)。

bashプロセスがいつコマンドを実行するかを知りたいです。 bashが_自分の環境に追加されていない場合は、自分の環境から削除する必要があるのはなぜですか?

ありがとうございます。

ベストアンサー1

現実はあなたが説明する2つの可能性の間のどこかにあります。 Bashは独自の環境を追加しませんmyvar。少なくとも私たちが一般的に完全なシェル環境だと思うmyvar環境一時的な環境。次に、一時環境だけでなく、現在の変数コンテキストおよびシェル関数からエクスポート環境、特に新しいコマンドを構築します。今後サブコマンドを実行する必要がある場合は、フォークしてください。と考えてください。maybe_make_export_envソースコードからBashを呼び出します。。子供が始まった後に一時的な環境を整理しますdispose_used_env_vars

実際には違いはありません。サブコマンドは受信する必要がある環境を取得し、Bashを変更しない限り制御権を再取得した後は、親環境がその状態になければなりません。それがすべてです。

おすすめ記事