()가 실제로 서브쉘을 생성합니까? [복사]

()가 실제로 서브쉘을 생성합니까? [복사]

나는 보았다이 비디오이는 괄호 안의 명령을 실행하면 실제로는 원래 쉘의 하위 프로세스인 서브쉘에서 명령을 실행한다는 것을 설명합니다. 다음 실험을 실행합니다.

// 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의 일부 최적화인 것 같습니다. 첫 번째 경우에는 실제로 다른 쉘을 생성할 필요가 없으므로 그렇게 하지 않습니다. 두 번째 경우에는 명령에 가 포함되어 있으므로 cd /현재 셸에 영향을 미치므로 다른 프로세스를 생성해야 합니다. 그렇습니까?

관련 정보