이 상황에서 "깨진 파이프"를 보는 것은 드물지만 정상입니다.
을 실행 type rvm | head -1
하면 bash type rvm
는 한 프로세스 head -1
에서 다른 프로세스로 실행 됩니다 . 1 의 표준 출력은 파이프type
의 "쓰기"말단에 연결되어 있으며, " 표준 "은 "읽기"말단에 연결되어 있습니다. 두 프로세스가 동시에 실행됩니다.head
이 head -1
프로세스는 stdin (일반적으로 8kB 청크 단위)에서 데이터를 읽고 단일 라인을 인쇄하고 ( -1
옵션 에 따라 ) 종료하여 파이프의 "읽기"끝이 닫힙니다. rvm
함수가 상당히 길기 때문에 (bash에서 파싱하고 재구성 한 후 약 11kB), 이는 여전히 몇 kB의 데이터를 쓸 때 head
종료 한다는 것을 의미합니다 type
.
이 시점에서, type
다른 쪽 끝이 닫힌 파이프 ( 부러진 파이프)에 쓰려고 시도하기 때문에이 파이프가 쓴 write () 함수는 "깨진 파이프"로 변환 된 EPIPE 오류를 반환합니다. 이 오류 외에도 커널은 SIGPIPE 신호를로 보내면 type
기본적으로 프로세스가 즉시 종료됩니다.
(대부분의 사용자는 첫 번째 프로세스가 계속 실행되고 아무데도 쓰려고하지 않기 때문에이 신호는 대화식 쉘에서 매우 유용합니다. 한편 비 대화식 서비스는 SIGPIPE를 무시합니다. 장기 실행 데몬에는 좋지 않습니다. 그런 간단한 오류로 죽어라. 그래서 그들은 오류 코드가 매우 유용하다는 것을 알게된다.)
그러나 신호 전달은 즉시 100 %가 아니며 write ()가 EPIPE를 반환하고 신호를 받기 전에 잠시 동안 프로세스가 계속 실행되는 경우가있을 수 있습니다. 이 경우 type
SIGPIPE에 의해 종료되기 전에 쓰기 실패를 확인하고 오류 코드를 변환하며 오류 메시지를 stderr로 인쇄 할 수있는 충분한 시간을 얻습니다. (오류 메시지에는 "-bash : type :"이라고 표시되어 있기 때문에 type
bash 자체의 기본 제공 명령입니다.)
type
프로세스와 커널의 신호 전달 코드가 문자 그대로 동시에 다른 코어에서 실행될 수 있기 때문에 이것은 다중 CPU 시스템에서 더 일반적으로 보입니다 .
type
write () 함수로부터 EPIPE를 수신 할 때 즉시 종료 되도록 내장 (bash의 소스 코드에서)을 패치하여이 메시지를 제거 할 수 있습니다 .
그러나 걱정할 필요는 없으며 rvm
어떤 식 으로든 설치 와 관련이 없습니다 .