하위 쉘은 하위 쉘과 동일합니까?

하위 쉘은 하위 쉘과 동일합니까?

다음 두 가지 이름이 있습니다.서브쉘그리고어린 껍질.

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

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

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


POSIX이 정의가 있습니다:

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

그러나 위 링크의 마지막 단락에는 다음과 같은 내용이 있습니다.

서브쉘 환경은 무시되지 않는 신호 트랩이 기본 동작으로 설정된다는 점을 제외하고 쉘 환경의 복사본으로 생성되어야 합니다.

특히:

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

거기 sh -c 'echo "Hello"'에는 포함되어 있지 않습니다. 서브 쉘이라고도 불러야합니까?

답변1

서브쉘중복기존 쉘. 동일한 변수 1, 동일한 기능, 동일한 옵션 등이 있습니다. 내부적으로는 다음을 사용하여 하위 쉘이 생성됩니다.fork시스템 호출²; 부모 프로세스가 기다리 $(…)거나(예: ) 수명을 계속하거나(예: … &) 예상되는 작업(예: … | …)을 수행하는 동안 자식 프로세스는 기대되는 작업을 계속합니다.

sh -c …서브쉘을 생성하지 않습니다. 다른 프로그램이 시작됩니다. 그 프로그램은 쉘이지만 그것은 단지 우연의 일치일 뿐입니다. 프로그램은 다른 쉘일 수도 있습니다(예: sh -c …bash에서 실행하고 sh대시인 경우). 즉, 동작에 있어서 상당한 유사성을 갖는 완전히 다른 프로그램일 수도 있습니다. 내부적으로는 외부 명령( sh또는 기타 명령) 을 실행하면 fork시스템 호출이 호출되고execve시스템 호출바꾸다sh다른 프로그램(여기 ) 에 의한 하위 프로세스의 쉘 프로그램 .

¹ 를 포함 $$하지만 bash 및 mksh와 같은 일부 셸 관련 변수는 제외합니다 BASHPID.
² 적어도 그것은 전통적이고 일반적인 구현입니다. 쉘은 다른 동작을 모방할 수 있는 경우 포크를 최적화할 수 있습니다. 보다"하위 쉘"과 "하위 프로세스"의 정확한 차이점은 무엇입니까?

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

답변2

하위 셸 환경은 별도의 프로세스에 존재할 필요가 없으며 현재 실행 환경을 복제하기만 하면 됩니다. 이는 를 호출하지 않는 메커니즘 ksh93에 의해 수행됩니다 . 이로 인해 ksh93은 포크와 마찬가지로 매우 느린 구식 플랫폼에서 매우 빠릅니다 .virtual sub-shellfork()Win-DOSWin-DOS

sh -c cmd다른 쪽에서는 현재 대화형 셸과 동일할 필요가 없는 기본 셸을 사용하여 새 프로세스를 만듭니다.

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

관련 정보