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 체인을 통해 종료됩니다.while
grep
grep
SIGPIPE
존재하다
예 "테스트" | 줄을 읽는 중; echo $line | grep -E "*" 완료 |3개의 프로세스
yes
, 즉 쉘 프로그램과 grep
. 그러나 쉘 프로그램을 실행하는 프로세스인 두 번째 프로세스는 지속적으로 두 개의 프로세스를 생성합니다.더 멀리하위 프로세스 중 하나는 작업을 수행 echo
하고 다른 하나는 다른 grep
인스턴스를 실행합니다. SIGPIPE
다음을 보내는 것은 후자의 프로세스입니다 .아니요쉘 프로그램을 실행하는 프로세스입니다. 결국 후자의 프로세스는 실제로 손상된 파이프에 쓰는 것입니다.
그 결과 파이프라인의 두 번째 단계인 while
루프를 실행하는 셸은 결코그 자체종료 SIGPIPE
하고 계속 실행하여 하위 파이프라인을 계속해서 생성합니다. 생성된 하위 파이프는 물론 종료되지만 SIGPIPE
루프를 실행하는 셸 에서는while
아니요루프를 종료하는 이유입니다.