我看见这个视频这解释了当运行括号中的命令时,它实际上是在子 shell 中运行该命令,该子 shell 是原始 shell 的子进程。运行以下实验:
// one shell with PID 5344
~$ (find /)
// another shell
~$ ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
...
0 1000 5344 5333 20 0 10888 5220 do_wai Ss pts/0 0:00 bash
0 1000 5384 5333 20 0 10888 5140 do_wai Ss pts/1 0:00 bash
0 1000 7239 5344 20 0 10860 3444 - R+ pts/0 0:00 find /
4 1000 7240 5384 20 0 11400 3224 - R+ pts/1 0:00 ps l
我们可以看到它find /
是 的子级5344
,中间没有其他 shell。在哪里运行:
// one shell with PID 5344
(cd /; find /)
// second shell
~$ ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
...
0 1000 5344 5333 20 0 10888 5220 do_wai Ss pts/0 0:00 bash
0 1000 5384 5333 20 0 10888 5140 do_wai Ss pts/1 0:00 bash
1 1000 7379 5344 20 0 10888 3036 do_wai S+ pts/0 0:00 bash
4 1000 7380 7379 20 0 10864 3536 - R+ pts/0 0:01 find /
4 1000 7381 5384 20 0 11400 3184 - R+ pts/1 0:00 ps l
现在我们可以看到中间的另一个外壳。我的猜测是,这是 bash 的一些优化:在第一种情况下,它实际上不必生成另一个 shell,所以它只是不这样做。在第二种情况下,由于命令包含cd /
,这将对当前 shell 产生影响,因此它必须生成另一个进程。是这样吗?