Não tem nada a ver com a nova linha.
Se você executar seu comando usando strace
, descobrirá que cat
receberá um SIGPIPE
no final antes de ser fechado:
$ strace cat | read
...
someOutput
...
+++ killed by SIGPIPE +++
- O primeiro comando
cat
é executado. - Então você digita algo pela primeira vez e aperta o Enter .
- O que você digitou será canalizado para o
read
. -
cat
ainda está em execução e aguardando um EOF. - Você digita outra coisa e, em seguida, pressiona o Enter agian.
-
Desta vez, não é possível canalizar para
read
, porque não há maisread
esperando pela entrada (ela foi fechada após o primeiro canal), a menos que você a execute assim:cat | while read line; do echo $line; done;
-
cat
receberá umSIGPIPE
e será fechado.
Um processo recebe um SIGPIPE quando tenta gravar em um pipe (chamado ou não) ou no soquete do tipo SOCK_STREAM que não possui mais nenhum leitor. [1]
Receber SIGPIPE
acontece depois quando o segundo pipe acontece.
Por exemplo, considere o comando yes
, porque um comando como yes
canaliza algo rápido e repetidamente:
yes | read
ele é fechado imediatamente após o segundo canal, preste atenção nas duas write()
chamadas:
close(3) = 0
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=3542, si_uid=1000} ---
+++ killed by SIGPIPE +++
Embora o comando yes
seja muito rápido, você pode ver mais de duas chamadas write()
, no entanto, se você executá-lo várias vezes, verá pelo menos duas chamadas e nunca uma.