하위 셸은 자식 셸과 같은 것 정의는 다음과 같습니다.

이 두 가지 이름이 있습니다 : subshellchild-shell .

예, 다음 중 하나에 의해 자식 프로세스가 시작됩니다.

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat

모두 동일하고 동일한 이름을 공유합니까? 모두 같은 속성을 공유합니까?


POSIX의 정의는 다음과 같습니다.

쉘 실행 환경은 …로 구성됩니다.

그러나 위 링크의 마지막 단락은 다음과 같습니다.

서브 쉘 환경은 쉘 환경의 복제본으로 작성되어야하며, 무시되지 않는 신호 트랩은 기본 조치로 설정되어야합니다.

그리고 특별히 :

명령 대체, 괄호로 묶인 명령 및 비동기 목록은 서브 쉘 환경에서 실행되어야합니다. 또한 다중 명령 파이프 라인의 각 명령은 서브 쉘 환경에 있습니다. ….

sh -c 'echo "Hello"', 거기에 포함되지 않는다는는 서브 쉘을 호출해야?



답변

서브 쉘 은 기존 쉘을 복제 합니다. 같은 변수 fork¹, 같은 함수, 같은 옵션 등을 가지고 있습니다. 후드 아래에서 서브 쉘은 시스템 콜 ²으로 생성됩니다 . 자식 프로세스는 부모가 기다리는 동안 (예 🙂 $(…)또는 수명으로 진행하는 동안 (예 🙂 … &또는 그렇지 않은 경우 프로세스 (예 :)를 수행하는 동안 계속해서 프로세스를 진행합니다 … | ….

sh -c …서브 쉘을 작성하지 않습니다. 다른 프로그램을 시작합니다. 그 프로그램은 쉘이지만, 우연의 일치 일뿐입니다. 프로그램은 심지어 다른 쉘 (예를 들어, sh -c …bash에서 실행 하고 sh대시 인 경우) 일 수도 있습니다. 즉, 동작과 상당히 유사한 완전히 다른 프로그램 일 수도 있습니다. 내부 명령에서 외부 명령 ( sh또는 다른 명령)을 실행 하면 fork시스템 호출을 호출 한 다음 서브 execve시스템 의 쉘 프로그램을 다른 프로그램 (여기서 ) 으로 대체 하기 위해 시스템 호출을 호출합니다 sh.

¹ 포함 $$하지만 bash 및 mksh와 같은 일부 쉘 특정 변수는 제외 BASHPID.
² 최소한, 그것은 전통적이고 일반적인 구현입니다. 쉘은 다른 방식으로 동작을 모방 할 수 있으면 포크를 최적화 할 수 있습니다.

관련 매뉴얼 페이지 : fork (2) , execve (2) .


답변

하위 셸 환경은 별도의 프로세스에있을 필요가 없으며 현재 실행 환경을 복제하기 만하면됩니다. 에서 ksh93이것을하면됩니다 virtual sub-shell호출하지 않습니다 메커니즘 fork(). 이것은 ksh93 을 포크와 Win-DOS같이 Win-DOS매우 느린 고풍 플랫폼에서 매우 빠릅니다 .

sh -c cmd 다른 쪽은 기본 대화식 쉘을 사용하여 현재 대화식 쉘과 같을 필요가없는 새 프로세스를 작성합니다.

sh현재 쉘이 동일 하더라도 실행 환경을 복제하지 않으므로을 생성하지 않습니다 sub-shell.