次のことが混乱しています。 - 名前を入力して現在のシェルでスクリプトを実行するか、プログラムを実行する場合
- $ PATH変数を検索して実行可能ファイルの場所を見つけます。
- 見つかったら、現在のシェルで実行可能ファイルを実行しますか、それとも実行可能ファイルを実行するためのサブシェル/プロセスを作成しますか?
実行可能ファイルを実行するために新しいサブプロセスが作成されると思います。しかし、子プロセスが実行可能ファイルを実行する方法(実行可能ファイルのパス)をどのように知ることができますか? — 実行可能ファイルを検索するように親シェルで PATH を変更したが (PATH=$PATH:/newpath/to/executable を使用)、エクスポートを実行しない場合
e.g., — I did not do an export here
$ PATH=$PATH:/path/to/executable
$ executable
親シェルが実行可能ファイルを見つけたら、次に何をしますか(サブプロセスの作成?実行可能ファイルの実行?)。しかし、編集されたPATH環境が子プロセスとしてエクスポートされていない場合、子プロセスはどのように実行可能ファイルを見つけますか?
答え1
検索を行う人は通常親ではありません$PATH
。通常カーネル。
内部的に新しいプロセスを作成することはfork
(新しいプロセスを生成しますが、現在のコードを実行し続けます。親プロセスと子プロセスは通常、各ブランチを独自のブランチとして処理します。if
)実装する*オプションのコンテンツ(ファイル記述子のリダイレクトやシグナル設定など)を使用して呼び出されます(現在のプロセスイメージを新しいプロセスイメージに置き換えます)。
これ実装する* p
exec系列(exec系列は同じことを行う別の方法です)のメンバーは、$PATH
スラッシュのない引数を解析するときにカーネルに環境変数を取得させます。
パスが検証されると、カーネルはそのパスをバイナリとして実行しようとします。電子が失敗し、実行可能ファイルにshebang行がある場合はshebang行を使用します。 Shebang行を使用すると、そこに指定されたインタプリタが実行され、解析されたパスが渡されます。
答え2
サブシェルとサブプロセスには違いがあります。サブシェルについてお問い合わせいただきました。
親シェルが実行可能ファイルを見つけるたびに、親シェルのすべての変数にアクセスできるサブシェルが作成されます。これがサブシェルが変数PATHにアクセスできる理由です。
親シェルが子プロセスを作成すると、子プロセスの変数へのアクセスが制限されます。
次の命令で確認できます。
a=1 設定解除
(echo "a はサブシェルの $a です。")
sh -c 'echo "a はサブシェルの $a です。"'
詳しくはリンクをご覧くださいサブシェル情報