因此,如果我输入如下命令,PID 4920
子 shell 就会创建一个子进程 ( )。
linuxprobe@DESKTOP-TP0G72N:~$ (sleep 2;ps -f --forest;sleep 5)
UID PID PPID C STIME TTY TIME CMD
linuxpr+ 513 512 0 Feb17 pts/0 00:00:00 -bash
linuxpr+ 4920 513 0 01:35 pts/0 00:00:00 \_ -bash
linuxpr+ 4922 4920 0 01:35 pts/0 00:00:00 \_ ps -f --forest
如果我输入如下命令,似乎没有创建子进程
linuxprobe@DESKTOP-TP0G72N:~$ (ps -f --forest)
UID PID PPID C STIME TTY TIME CMD
linuxpr+ 513 512 0 Feb17 pts/0 00:00:00 -bash
linuxpr+ 5511 513 0 01:45 pts/0 00:00:00 \_ ps -f --forest
为什么第一个例子中subshell可以创建子进程呢?
答案1
这不是能不能的问题,而是能不能的问题。正如您所看到的,两者都创建了一个子流程。
不同之处在于,在第二种情况下,shell 中的最后一个命令是 ps 执行。
因为此后没有发生任何事情,所以您的 bash 决定不在分叉进程中执行,而是直接执行 ps 可执行文件本身,而无需之前分叉。
所以,不是一个问题能,但问题是选择不,进行优化。