
다음 두 가지 이름이 있습니다.서브쉘그리고어린 껍질.
예, 다음 중 하나에 의해 하위 프로세스가 시작됩니다.
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
하위 셸 환경은 별도의 프로세스에 존재할 필요가 없으며 현재 실행 환경을 복제하기만 하면 됩니다. 이는 를 호출하지 않는 메커니즘 ksh93
에 의해 수행됩니다 . 이로 인해 ksh93은 포크와 마찬가지로 매우 느린 구식 플랫폼에서 매우 빠릅니다 .virtual sub-shell
fork()
Win-DOS
Win-DOS
sh -c cmd
다른 쪽에서는 현재 대화형 셸과 동일할 필요가 없는 기본 셸을 사용하여 새 프로세스를 만듭니다.
현재 쉘이 동일 하더라도 sh
실행 환경을 복제하지 않으므로 sub-shell
.