이 두 가지 이름이 있습니다 : subshell 과 child-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
.