web-dev-qa-db-ja.com

スクリプトは、現在のシェルまたは子シェルで実行されているプログラムですか?

次の点で混乱しています-スクリプトを実行したり、現在のシェルで名前を入力してプログラムを実行したりした場合

  1. $ PATH変数を検索して、実行可能ファイルの場所を見つけます
  2. それが見つかると、現在のシェルで実行可能ファイルを実行しますか、それとも実行可能ファイルを実行するために子シェル/プロセスを生成しますか?

実行可能ファイルを実行するために新しい子プロセスが生成されると思いますが、そうは言っても、子プロセスは実行可能ファイルを実行するために(実行可能ファイルへのパス)をどのように知っていますか? —親シェルのPATHを修正して、実行可能ファイルを見つけることができるようにしたが(PATH = $ PATH:/ newpath/to/executeableのみを使用)、エクスポートを行わなかった場合

e.g., — I did not do an export here
$ PATH=$PATH:/path/to/executable
$ executable 

親シェルが実行可能ファイルを見つけると、次に何をしますか(子プロセスを生成しますか?実行可能ファイルを実行しますか?)。ただし、編集したPATH環境がエクスポートされていない場合、子プロセスはどのようにして実行可能ファイルを見つけますか。

3
Noob

通常、$PATHを検索するのは親ではありません。通常はカーネルです。

内部的には、新しいプロセスの生成はfork(新しいプロセスを作成しますが、現在のコードを実行し続けます。親と子は通常、それぞれ独自のifブランチに入ります)の後に exec * 呼び出し(現在のプロセスイメージを新しいプロセスイメージに置き換えます)と、その間にオプションのもの(ファイル記述子のリダイレクトや信号設定など)を使用します。

exec *p execファミリーのメンバー(execファミリーは同じことをさまざまな方法で実行している)がカーネルを作成しますスラッシュが含まれていない引数を解決するときは、$PATH環境変数を検索してください。

パスが解決されると、カーネルはそれをバイナリとして実行しようとします。前者が失敗し、実行可能ファイルにシバン行がある場合は、シバン行に頼ります。シバンラインが使用されている場合、そこで指定されたインタープリターが実行され、解決されたパスが渡されます。

3
PSkocik

サブシェルと子プロセスには違いがあります。あなたが求めているのはサブシェルについてです。

親シェルが実行可能ファイルを見つけると、サブシェルを生成します。サブシェルは、親シェルのすべての変数にアクセスできます。そのため、変数PATHはサブシェルにもアクセスできます。

親シェルが子プロセスを生成すると、子プロセスでは変数へのアクセスが制限されます。

次のコマンドで確認できます。

設定を解除します。 a = 1
(echo "aはサブシェルの$ aです")
sh -c'echo "aは子シェルの$ aです" '

詳細については、リンクを参照してください サブシェル情報

0
AVJ