다음 두 가지 이름이 있습니다.서브쉘그리고서브쉘.
예, 하위 프로세스는 다음 방법 중 하나로 시작됩니다.
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
서브쉘 환경은 별도의 프로세스에 존재할 필요가 없으며, 현재 실행 환경만 복사하면 됩니다. 이는 를 호출하지 않음 ksh93
으로써 수행됩니다 . 이로 인해 ksh93과 같은 고대 플랫폼에서는 ksh93이 매우 빨라지고 분기되면 매우 느려 집니다 .virtual sub-shell
fork()
Win-DOS
Win-DOS
sh -c cmd
반면에 기본 셸을 사용하면 현재 대화형 셸과 동일할 필요가 없는 새 프로세스가 생성됩니다.
sh
현재 쉘이 동일 하더라도 실행 환경이 복사되지 않아 생성되지 않습니다 sub-shell
.