서브쉘은 서브쉘과 동일합니까?

서브쉘은 서브쉘과 동일합니까?

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

예, 하위 프로세스는 다음 방법 중 하나로 시작됩니다.

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

모두 동일하고 이름이 동일합니까? 모든 사람은 동일한 속성을 가지고 있습니까?


POSIX이런 정의가 있어요:

쉘 실행 환경에는 다음이 포함됩니다.

하지만 위 링크의 마지막 문단은 이렇습니다.

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

특히:

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

거기에 포함되지 않은 sh -c 'echo "Hello"'것도 서브쉘이라고 불러야 할까요?

답변1

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

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

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

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

답변2

서브쉘 환경은 별도의 프로세스에 존재할 필요가 없으며, 현재 실행 환경만 복사하면 됩니다. 이는 를 호출하지 않음 ksh93으로써 수행됩니다 . 이로 인해 ksh93과 같은 고대 플랫폼에서는 ksh93이 매우 빨라지고 분기되면 매우 느려 집니다 .virtual sub-shellfork()Win-DOSWin-DOS

sh -c cmd반면에 기본 셸을 사용하면 현재 대화형 셸과 동일할 필요가 없는 새 프로세스가 생성됩니다.

sh현재 쉘이 동일 하더라도 실행 환경이 복사되지 않아 생성되지 않습니다 sub-shell.

관련 정보