
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 -E "*" | grep -m3 "테스트"실행 중인 4개의 프로세스, 해당 루프를
yes
실행하는 셸 프로그램 , 및 각각이 있습니다 . 세 번의 일치 후에 파이프라인의 마지막 프로세스가 종료되고 입력 파이프의 읽기 끝이 닫힙니다. 그런 다음 파이프라인은 조기 종료된 파이프라인의 일반적인 방식으로 s 체인에 의해 종료됩니다. 이는 파이프라인의 각 단계가 결국 끊어진 파이프에 쓰기로 끝나기 때문입니다.while
grep
grep
SIGPIPE
~ 안에
예 "테스트" | 라인을 읽는 동안; $line을 에코하세요 | grep -E "*"; 완료 | grep -m3 "테스트"3개의 프로세스
yes
, 즉 쉘 프로그램이 grep
각각 실행되고 있습니다. 그러나 쉘 프로그램을 실행하는 두 번째 프로세스는 계속해서 두 개의 프로세스를 생성합니다.더 나아가하위 프로세스 중 하나는 해당 인스턴스를 수행 echo
하고 다른 하나는 다른 grep
인스턴스를 실행합니다. 전송되는 것은 후자의 프로세스입니다 SIGPIPE
.~ 아니다쉘 프로그램을 실행하는 프로세스. 결국 실제로 깨진 파이프에 쓰는 것은 후자의 프로세스입니다.
그 결과 파이프라인의 두 번째 단계인 해당 while
루프를 실행하는 셸은 결코그 자체종료되고 SIGPIPE
계속 실행되어 하위 파이프라인이 생성됩니다. 계속해서. 물론 생성된 하위 파이프라인이 종료되는 것을 볼 수 있지만 루프를 SIGPIPE
실행하는 셸의 경우while
~ 아니다루프를 종료하는 이유.