읽는 동안, grep, 파이프 및 일시 중지

읽는 동안, grep, 파이프 및 일시 중지
yes "test" | grep -m3 "test"

인쇄

test
test
test

그런 다음 종료하십시오. 이것도 이렇다

yes "test" | while read line; do echo $line; done | grep -m3 "test"

그리고

yes "test" | while read line; do echo $line; done | grep -E "*" | grep -m3 "test"

하지만

yes "test" | while read line; do echo $line | grep -E "*"; done | grep -m3 "test"

인쇄

test
test
test

그런 다음 중단됩니다. 여기서 무슨 일이 일어나고 있는 걸까요?

답변1

존재하다

예 "테스트" | 줄을 읽는 동안; echo $line 완료 | grep -m3 "test"
yes실행 중인 프로세스, 루프를 실행하는 셸 프로그램 이라는 네 가지 프로세스가 있습니다 . 파이프의 마지막 프로세스는 세 번의 일치 후에 종료되어 입력 파이프의 읽기 끝을 닫습니다. 그런 다음 파이프라인의 각 단계가 결국 손상된 파이프에 쓰기 때문에 파이프를 조기 종료하는 일반적인 방법으로 s 체인을 통해 종료됩니다.whilegrepgrepSIGPIPE

존재하다

예 "테스트" | 줄을 읽는 중; echo $line | grep -E "*" 완료 |
3개의 프로세스 yes, 즉 쉘 프로그램과 grep. 그러나 쉘 프로그램을 실행하는 프로세스인 두 번째 프로세스는 지속적으로 두 개의 프로세스를 생성합니다.더 멀리하위 프로세스 중 하나는 작업을 수행 echo하고 다른 하나는 다른 grep인스턴스를 실행합니다. SIGPIPE다음을 보내는 것은 후자의 프로세스입니다 .아니요쉘 프로그램을 실행하는 프로세스입니다. 결국 후자의 프로세스는 실제로 손상된 파이프에 쓰는 것입니다.

그 결과 파이프라인의 두 번째 단계인 while루프를 실행하는 셸은 결코그 자체종료 SIGPIPE하고 계속 실행하여 하위 파이프라인을 계속해서 생성합니다. 생성된 하위 파이프는 물론 종료되지만 SIGPIPE루프를 실행하는 셸 에서는while아니요루프를 종료하는 이유입니다.

관련 정보