Bashで実行するとき
myvar=val mycommand myargs
myvar=val
実行環境に追加されますmycommand
。
bashプロセス呼び出しがfork()
実行するサブプロセスmycommand
、つまりmycommand
外部実行可能ファイルまたはスクリプトファイルを生成するとします。
myvar=val
bashシェル呼び出しの前後にいつ環境に追加されますかfork()
?つまり、次の2つの可能性のうち実際に発生したものは何ですか?
Bashプロセスは、
myvar=val
独自の環境に追加され、実行を呼び出し、Bashプロセス環境の一部として子プロセス環境に継承されるfork()
子プロセスを作成するために呼び出されます。子プロセスが実行を完了して終了すると、bashプロセスは自分の環境で終了します。execve()
mycommand
myvar=val
mycommand
myvar=val
bashプロセス呼び出しは、
fork()
実行するサブプロセスを作成し、mycommand
そのサブプロセスをmyvar=val
独自の環境に追加してからexecve()
実行を呼び出しますmycommand
。
私の質問の動機は次のとおりです。私の以前の投稿に対するStephenの答え。
Bashは、
_
コマンドを解析するたびに最後のパラメータの値に設定される特別なパラメータです。また、コマンドが実行されるたびに適用されるエクスポートできない特殊属性もあります(参照:bind_lastarg
Bashのソースコードから)。
bashプロセスがいつコマンドを実行するかを知りたいです。 bashが_
自分の環境に追加されていない場合は、自分の環境から削除する必要があるのはなぜですか?
ありがとうございます。
答え1
現実はあなたが説明する2つの可能性の間のどこかにあります。 Bashは独自の環境を追加しませんmyvar
。少なくとも私たちが一般的に完全なシェル環境だと思うmyvar
環境一時的な環境。次に、一時環境だけでなく、現在の変数コンテキストおよびシェル関数からエクスポート環境、特に新しいコマンドを構築します。今後サブコマンドを実行する必要がある場合は、フォークしてください。と考えてください。maybe_make_export_env
ソースコードからBashを呼び出します。。子供が始まった後に一時的な環境を整理しますdispose_used_env_vars
。
実際には違いはありません。サブコマンドは受信する必要がある環境を取得し、Bashを変更しない限り制御権を再取得した後は、親環境がその状態になければなりません。それがすべてです。