()は実際にサブシェルを生成しますか? [コピー]

()は実際にサブシェルを生成しますか? [コピー]

私は見たこの動画これは、括弧内のコマンドを実行すると、実際には元のシェルのサブプロセスであるサブシェルでコマンドを実行することを示しています。次の実験を実行します。

// 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実行する場所:

// 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のいくつかの最適化のようです。最初のケースでは、実際に別のシェルを作成する必要はないので、そうしません。 2番目のケースでは、コマンドにが含まれているため、cd /現在のシェルに影響を与えるため、別のプロセスを作成する必要があります。そうですか?

関連情報