2014-12-27 5 views
2

나는 The TTY demystified을 읽습니다. 마지막 세 xterm, bash합니다 (xterm의 아이), 그리고 다음 "잡스와 세션"섹션에서 xterm을 사용하여 사용자의 예제가있다 :bash 서브 쉘이 새로운`bash` 프로세스를 생성합니까?

$ cat 
hello 
hello 
^Z 
[1]+ Stopped     cat 
$ ls | sort 

는 그리고 관련된 프로세스를 나열하는 테이블이 있습니다 프로세스 (cat, lssort)는 모두 동일한 PPID (부모 프로세스 ID)를 갖습니다. 이들은 모두 동일한 bash 프로세스의 하위 항목입니다.

이제 bash의 파이프 라인이 하위 쉘에서 실행된다는 것을 알고 있습니다. 나는 항상이 서브 쉘의 의미는 각 서브 쉘에 대해 여분의 bash 프로세스가 있음을 의미한다고 생각 해왔다. 내 질문은 : 다른 두 개의 bash 프로세스가 없어야하고, 첫 번째 bash의 자식과 ls의 자식이 모두 첫 번째 bash의 자식이되고 sort이 두 번째 bash의 자식이 될까요? 기사의 표가 단순합니까? 아니면 하위 셸에 대한 이해가 잘못 되었습니까?

+1

Bash의 동작은 구성 가능합니다. 귀하의 전반적인 일반 설정은 기본 설정 (특히 '파이프 라인은 하위 쉘에서 실행됩니다'는 정확하지 않습니다)로는 완전히 정확하지 않습니다. ['PIPESTATUS'] (http://www.gnu.org/software/bash/manual/bash.html#Bash-Variables)와''shopt -s lastpipe' (http://www.gnu.org)를보십시오. /software/bash/manual/bash.html#The-Shopt-Builtin) 및 ['set -o pipefail'] (http://www.gnu.org/software/bash/manual/bash.html#The-Set -Builtin). –

답변

2

프로그램은 하위 프로세스에서 실행되지만 하위 쉘은 실행되지 않습니다. 쉘은 자식을 포크하고 필요에 따라 표준 입력/출력/오류를 리디렉션 한 다음 즉시 execv()을 호출하여 프로그램을 실행합니다.

매우 짧은 기간 동안 하위 프로세스는 여전히 bash으로 실행되지만 쉘 명령 처리를 수행하지 않으므로이 하위 쉘을 고려하지 않습니다. 모든 쉘 쉘은 원래 쉘에서 완료되었으며 하위 노드는 외부 프로그램을 시작하십시오 (예 : ls과 같은 명령의 경우 명시적인 exec을 통해).

파이프 라인의 경우 명령이 쉘 내장 인 경우 하위 쉘에서 실행됩니다. 따라서 수행 할 경우 :

ls | read var 

두 개의 하위 프로세스가 생성됩니다. 한 어린이는 ls을 실행하고 다른 하나는 read var을 실행하는 서브 쉘이됩니다.

+0

제 생각에 위의'cat' 명령과 같은 프로세스에 대해 설명한 내용은 사실입니다. 하지만 제 질문은 특히 파이프 라인에 관한 것입니다. 파이프 라인은 항상 서브 쉘에서 실행됩니다. – fonini

+0

파이프 라인에서 실행중인 서브 쉘에 대한 설명을 업데이트했습니다. – Barmar

2

직접 또는 파이프를 통해 실행 파일을 호출해도 서브 쉘이 생성되지 않습니다. 명시 적으로 서브 셸 내에서 ((...), $(...) 등을 통해) 호출하면됩니다.

+0

모든 파이프 라인이 하위 쉘을 강제로 스폰한다고 생각했습니다. 잘못 됐나? – fonini

+0

파이프가 쉘 구조 인 경우에만 파이프가 하위 쉘을 생성하도록 만듭니다. 'while'또는 함수. –

관련 문제