Um SIGPIPE é enviado somente quando um programa tenta gravar em um canal fechado. Seria muito ruim enviar SIGPIPE de outra forma: programas que têm um pipe aberto podem nem estar cientes disso, e não devem ser mortos se nunca interagirem com o pipe.
Em for i in 1 2 3; do sleep 1; echo $i; done
, o comando sleep
não escreve nada, por isso não receberá um sinal. É somente quando echo
é executado que um SIGPIPE é enviado.
Em geral, o SIGPIPE não é projetado para trabalhos de precisão. Isso só serve para garantir que os programas cujo trabalho é produzir alguma saída não continuem correndo para sempre quando o consumidor dessa saída for embora. Na maioria dos cenários práticos, o programa no lado esquerdo dos buffers de pipe grava e só receberá um SIGPIPE na próxima vez que esvaziar seu buffer.
Se você quiser interromper um loop após várias iterações, crie essa lógica no loop.