하위 셸은 자식 셸과 같은 것


11

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