2

私が実行した場合:

$> bash script.sh

fork-and-exec はたまたま bash バイナリを実行します。そのプロセスはscript.shを実行しますか、それとも同じ方法でサブシェルを作成しますか

$> ./script.sh 

最初にスクリプトを実行するサブシェルを作成しますか?

4

2 に答える 2

2

実行される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
$
于 2014-08-27T22:48:44.737 に答える
2

pstreeまたはを使用ps -faxして、プロセス ツリーを表示できます。あなたの場合、bashをスクリプトパラメーターを使用して(フォークされた)コマンドとして指定する場合、「コマンドファイル」で実行することは操作の1つのモードであるため(-cを使用しない場合)、サブシェルをフォークする必要はありません(必要ありません)。

ところで:exec sh script.sh現在のシェルプロセスを新しいサブシェルに置き換えるために使用することもできます。

source(または) コマンドを使用せずにシェル スクリプトを呼び出すと.、サブシェルで実行されます。これは、2 行目の場合です。現在のスクリプトでスクリプトを実行する場合は、. ./script.sh.

于 2014-08-27T22:50:41.987 に答える