如果我运行:
$> bash script.sh
一个 fork-and-exec 恰好运行 bash 二进制文件。该进程是执行 script.sh 还是以与
$> ./script.sh
首先创建一个子shell来执行脚本?
如果我运行:
$> bash script.sh
一个 fork-and-exec 恰好运行 bash 二进制文件。该进程是执行 script.sh 还是以与
$> ./script.sh
首先创建一个子shell来执行脚本?
运行的bash
进程bash script.sh
直接执行脚本,而不是作为第二层的fork和exec。显然,脚本中的各个命令是单独分叉和执行的,而不是脚本本身。
你可以ps
用来证明这一点。例如,script.sh
可能包含:
tty
echo $$
sleep 20
您可以运行它并在另一个终端窗口中运行ps -ft tty0
(如果tty
命令指示tty0
),您会看到运行bash script.sh
命令的 shell、正在运行的 shellscript.sh
和sleep
命令。
在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 指定为带有脚本参数的(分叉)命令时,它不会(不需要)分叉子外壳,因为使用“命令文件”运行是一种操作模式(如果不使用 -c)。
顺便说一句:您还可以使用exec sh script.sh
新的子 shell 替换当前的 shell 进程。
当您调用没有source
(or .
) 命令的 shell 脚本时,它将在子 shell 中运行。您的第二行就是这种情况。如果要在当前脚本中运行脚本,则需要使用. ./script.sh
.