
제목 질문을 명확히 하기 위해 전자가 왜 죽는지 이해합니다. | 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
, | 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 이외의 쉘에서는 모든 파이프 구성 요소가 항상 하위 프로세스에서 실행됩니다.cat
cat
따라서 여기서는 실행 중인 프로세스만 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에 의해 살해되었습니다.