하위 셸은 자식 셸과 같은 것


11

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

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

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

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


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

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

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

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

그리고 특별히 :

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

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

답변:


14

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

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

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

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


감사. bash shebang으로 bash 스크립트를 실행하면 무엇에 속합니까?
Tim

@Tim 같은 것 sh -c: 우연히 쉘이되는 서브 프로세스입니다.
Gilles 'SO- 악마 그만해'

(1) "외부 명령 (sh 또는 기타)을 시작하면 포크 시스템 호출을 호출 한 다음 서브 시스템의 쉘 프로그램을 다른 프로그램 (여기 sh)으로 대체하기 위해 실행 시스템 호출을 수행합니다." 포크가 먼저 서브 쉘을 작성한 다음 서브 쉘을 외부 프로그램으로 대체하는 것이 옳습니까? 답장의 두 가지 경우에 항상 서브 쉘이 생성됩니까? (2) "기존 쉘을 복제하는 서브 쉘" "그것"은 무엇을 의미합니까?
Tim

(3)에서 bash -c <command>쉘을 포크 한 다음 실행 bash -c <command>하면 bash 쉘이 작성됩니다. 그런 다음 시스템 호출 <command>이 bash 쉘을 포크하고 실행하는 데 사용 <command>됩니까?
Tim

2
@cuonglm“Child Shell”은“subshell”과 달리 특정 의미를 가진 기술적 용어가 아닙니다. 그것이 자녀 인 껍질이라면, 일반적인 영어 규칙에 따라 자녀 껍질입니다.
Gilles 'SO- 악마 그만'

1

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

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

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


ksh93따라서을 제외한 다른 셸 에서는 하위 셸이 자식 셸입니까?
cuonglm

오늘날 가상 서브 쉘을 구현하는 다른 구현은 없습니다.
schily
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.