私が実行した場合:
$> bash script.sh
fork-and-exec はたまたま bash バイナリを実行します。そのプロセスはscript.shを実行しますか、それとも同じ方法でサブシェルを作成しますか
$> ./script.sh
最初にスクリプトを実行するサブシェルを作成しますか?
私が実行した場合:
$> bash script.sh
fork-and-exec はたまたま bash バイナリを実行します。そのプロセスはscript.shを実行しますか、それとも同じ方法でサブシェルを作成しますか
$> ./script.sh
最初にスクリプトを実行するサブシェルを作成しますか?
実行されるbashプロセスはbash script.sh、フォークと実行の第 2 層としてではなく、スクリプトを直接実行します。明らかに、スクリプト内の個々のコマンドはフォークされて個別に実行されますが、スクリプト自体はそうではありません。
それを示すために使用できますps。たとえば、次のものscript.shが含まれる場合があります。
tty
echo $$
sleep 20
それを実行し、別のターミナル ウィンドウで実行するとps -ft tty0(ttyコマンドが を示している場合)、コマンドを実行したシェル、実行中のシェル、およびコマンドが表示tty0されます。bash script.shscript.shsleep
でttys000:
$ bash script.sh
/dev/ttys000
65090
$
でttys001:
$ ps -ft ttys000
UID PID PPID C STIME TTY TIME CMD
0 2422 2407 0 9Jul14 ttys000 0:00.13 login -pfl jleffler /bin/bash -c exec -la bash /bin/bash
199484 2428 2422 0 9Jul14 ttys000 0:00.56 -bash
199484 65090 2428 0 3:58PM ttys000 0:00.01 bash script.sh
199484 65092 65090 0 3:58PM ttys000 0:00.00 sleep 20
$
pstreeまたはを使用ps -faxして、プロセス ツリーを表示できます。あなたの場合、bashをスクリプトパラメーターを使用して(フォークされた)コマンドとして指定する場合、「コマンドファイル」で実行することは操作の1つのモードであるため(-cを使用しない場合)、サブシェルをフォークする必要はありません(必要ありません)。
ところで:exec sh script.sh現在のシェルプロセスを新しいサブシェルに置き換えるために使用することもできます。
source(または) コマンドを使用せずにシェル スクリプトを呼び出すと.、サブシェルで実行されます。これは、2 行目の場合です。現在のスクリプトでスクリプトを実行する場合は、. ./script.sh.