Os comandos estão conectados a um pipe (estou falando aqui do primitivo do sistema - obviamente, eles estão conectados com um |
). Quando a extremidade de leitura do canal ( stdin
de head
) se torna close
d (== quando head
explicitamente ( close
) ou implicitamente (saída) a fecha), tenta gravar no write end ( stdout
of yes
) falhará.
Por padrão, isso não é apenas uma falha normal de errno
, mas uma falha que faz com que o processo de gravação receba o sinal SIGPIPE
. A ação padrão do manipulador do sinal SIGPIPE deve terminar.
Resumindo - se você gravar em um pipe quebrado, o sistema enviará a você um SIGPIPE
e, por padrão, um SIGPIPE
irá matar você. É por isso que yes
termina quando head
terminou (e, portanto, quebrou o canal).
Se você ignorar SIGPIPE
no shell pai, os comandos herdarão essa disposição e um write
em um canal corrompido simplesmente causará um erro errno
de EPIPE
. Conforme aparece, yes
restringe esse erro e imprime:
$ (trap "" SIGPIPE; yes | head -n 5)
y
y
y
y
yes: standard output: Broken pipe
yes: write error