왜 '사실인데; y를 에코하세요; 완료 | true'는 저절로 죽지만, 'true인 동안; y를 에코하세요 | 고양이; 완료 | 사실이지 그렇지 않습니까?

왜 '사실인데; y를 에코하세요; 완료 | true'는 저절로 죽지만, 'true인 동안; y를 에코하세요 | 고양이; 완료 | 사실이지 그렇지 않습니까?

제목 질문을 명확히 하기 위해 전자가 왜 죽는지 이해합니다. | cat루프 본문에 a를 추가하기 때문에 후자가 왜 그렇지 않은지 이해하지 못합니다 .

또한 관련이 있을 수도 있고,

while true; do echo y; done

내가 하면 즉시 죽지만 ^C, 죽인다

while true; do echo y | cat; done

종종 ^C두 번 이상 타격을 가합니다. 한 번 효과가 있을 때도 있고, 2~3번 효과가 있을 때도 있고, 그러다가 ^C죽을 때까지 잠시 기다려야 할 때도 있습니다 .

두 가지 동작 모두 bash와 zsh에서 모두 발생하지만 ^Cbash에서는 더 드물게 발생합니다.

두 동작 모두에 대해 파이프를 추가하는 것으로 제한되지 않습니다 cat. | dd, | tee등도 원인이 됩니다. 유발하기도 합니다 echo y | true. 루프 본체에 파이프가 존재하는 것 같습니다.

루프 본체에 파이프가 있으면 신호에 대한 루프의 응답이 변경되는 이유는 무엇입니까?

답변1

에서는 while true; do echo y; done | true가 내장되어 있으므로 파이프에 루프를 echo작성하는 하위 쉘 프로세스를 진행합니다 .y\n

반환 되면 true해당 파이프의 읽기 끝이 닫히므로 쓰기 끝으로 쓰면 a가 SIGPIPE쓰기 프로세스로 전달됩니다. 여기서는 루프를 실행하는 하위 셸 프로세스입니다.

에서는 파이프에 쓰는 것 while true; do echo y | cat; done | true입니다 . 일반적으로 내장되어 있지 않으며 내장되어 있더라도 zsh 및 ksh 이외의 쉘에서는 모든 파이프 구성 요소가 항상 하위 프로세스에서 실행됩니다.catcat

따라서 여기서는 실행 중인 프로세스만 cat죽고 루프를 실행하는 하위 셸 프로세스는 stdout에 cat쓰자마자 죽는 더 많은 프로세스를 계속 실행합니다.y\n

ksh93/ksh2020에서 다음을 수행하는 경우:

$ builtin cat
$ type cat
cat is a shell builtin
$ set -o pipefail
$ while true; do echo y | cat; done | true; kill -l "$?"
PIPE

이번에는 cat내장되어 있으며 루프와 동일한 프로세스에서 실행됩니다( cat첫 번째 파이프 라인의 가장 오른쪽 명령이고 ksh는 서브셸에서 해당 명령을 실행하지 않음). 따라서 서브셸 파이프는 true종료되고 kill -l그것이 실행되었는지 확인합니다. SIGPIPE에 의해 살해되었습니다.

관련 정보