"true일 때; echo y; done | true는 저절로 죽지만, while true; echo y | cat; done | yes'인 이유는 무엇입니까?"

"true일 때; echo y; done | true는 저절로 죽지만, while true; echo y | cat; done | yes'인 이유는 무엇입니까?"

제목 질문을 명확히하기 위해 전자가 죽은 이유를 이해합니다. 후자가 | cat루프 본문에 a를 추가하기 위해 이 작업을 수행하지 않는 이유를 이해할 수 없습니다 .

뭔가 관련이 있을지도 모르지만,

while true; do echo y; done

이렇게 하면 즉시 죽지 ^C만 죽습니다.

while true; do echo y | cat; done

종종 ^C한 번 이상의 타격이 필요합니다. 때로는 한 번, 때로는 2~3번, 그러다가 ^C죽기 전까지 한동안 버텨야 할 때도 있다 .

이러한 동작은 모두 bash와 zsh에서 발생하지만 이 ^C동작은 bash에서는 덜 일반적인 것으로 보입니다.

두 가지 동작 모두에 파이프를 추가하는 것에만 국한 되지 않고 cat. 아니면 원인이 되기도 합니다. 루프 본체에는 파이프가 없는 것 같습니다.| dd| teeecho y | true

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

답변1

에는 내장되어 while true; do echo y; done | true있으므로 루프의 파이프에 쓰는 하위 쉘 프로세스가 있습니다.echoy\n

반환 시 true파이프의 읽기 끝이 닫히므로 쓰기 끝으로 쓰면 a가 SIGPIPE쓰기 프로세스로 전달됩니다. 이 경우 이는 루프를 실행하는 하위 쉘 프로세스입니다.

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

따라서 여기에서는 실행 중인 프로세스만 cat종료되는 반면, 런 루프의 하위 쉘 프로세스는 표준 출력에 기록하자마자 종료되는 더 많은 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에 의해 살해되었습니다.

관련 정보