() 真的会生成子 shell 吗?

() 真的会生成子 shell 吗?

我看见这个视频这解释了当运行括号中的命令时,它实际上是在子 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 产生影响,因此它必须生成另一个进程。是这样吗?

相关内容