Bash 내장 기능이 파이프와 함께 작동하는 방식

Bash 내장 기능이 파이프와 함께 작동하는 방식

불다내장 정의처럼:

쉘은 다른 프로그램을 호출하지 않고 직접 명령을 실행합니다.

이와 같은 파이프라인은 foo | bar대략 다음과 같이 작동합니다. bar의 입력을 기다린 foo다음 foo종료합니다 bar.

Bash에서 이러한 파이프라인은 예상대로 작동합니다.

$ history | grep curl

하지만 작업이 완료되고 자체적으로 종료된다는 grep것을 어떻게 알 수 있습니까 ? 내장 프로세스이므로 새로운 프로세스가 생성되지 않습니다 history. 신호를 생성 history합니까 ?historyEOF

답변1

매뉴얼에 "다른 프로그램을 호출하지 마십시오"라고 적혀 있으면 쉘이 execve다른 프로그램을 실행하는 데 사용되지 않는다는 의미입니다. 명령이 리디렉션을 사용하는 경우 간단한 구현은 fork다른 프로세스로 이동하여 상위 셸의 파일 설명자를 수정하지 않고 해당 프로세스만 리디렉션하는 것입니다. 이는 또한 bash이 명령이 수행하는 작업이며 로 확인할 수 있습니다 strace.

내부 명령 분기를 피하기 위해 수행할 수 있는 몇 가지 트릭이 있지만 이 경우에는 사용되지 않는 것 같습니다.

두 번째 프로그램은 첫 번째 프로그램이 종료되었음을 감지할 수 없으며 파이프의 출력 끝이 닫혀 있다는 것만 감지할 수 있습니다(이는 프로그램이 종료되었거나 일반 때문일 수 있음 close). 파이프의 읽기 끝은 EOF를 받습니다.

파이프라인의 첫 번째 프로그램이 먼저 종료되는 것이 일반적이지만 반드시 그럴 필요는 없습니다. 생각해 보세요:

sleep 10 | echo done

파이프의 두 번째 프로그램이 첫 번째 프로그램보다 먼저 종료되고 첫 번째 프로그램이 파이프에 쓰려고 하면 신호를 받게 되며 SIGPIPE, 이 신호는 잡히지 않는 한 프로세스를 종료합니다.

(sleep 10; echo test ) | echo done

관련 정보