제목 질문을 명확히하기 위해 전자가 죽은 이유를 이해합니다. 후자가 | 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
종료되는 반면, 런 루프의 하위 쉘 프로세스는 표준 출력에 기록하자마자 종료되는 더 많은 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에 의해 살해되었습니다.