2

如果我运行:

$> bash script.sh

一个 fork-and-exec 恰好运行 bash 二进制文件。该进程是执行 script.sh 还是以与

$> ./script.sh 

首先创建一个子shell来执行脚本?

4

2 回答 2

2

运行的bash进程bash script.sh直接执行脚本,而不是作为第二层的fork和exec。显然,脚本中的各个命令是单独分叉和执行的,而不是脚本本身。

你可以ps用来证明这一点。例如,script.sh可能包含:

tty
echo $$
sleep 20

您可以运行它并在另一个终端窗口中运行ps -ft tty0(如果tty命令指示tty0),您会看到运行bash script.sh命令的 shell、正在运行的 shellscript.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

您可以使用pstreeps -fax查看进程树。在您的情况下,当将 bash 指定为带有脚本参数的(分叉)命令时,它不会(不需要)分叉子外壳,因为使用“命令文件”运行是一种操作模式(如果不使用 -c)。

顺便说一句:您还可以使用exec sh script.sh新的子 shell 替换当前的 shell 进程。

当您调用没有source(or .) 命令的 shell 脚本时,它将在子 shell 中运行。您的第二行就是这种情况。如果要在当前脚本中运行脚本,则需要使用. ./script.sh.

于 2014-08-27T22:50:41.987 回答