Estou no Bash, no Linux Mint. Se eu executar
{ echo 1 || >&2 echo "[ $? ]" ; } | echo
uma linha vazia é impressa. Observe que o Bash interpreta echo
como um built-in. Mas se eu executar
{ /bin/echo 1 || >&2 echo "[ $? ]" ; } | /bin/echo
ele produz
[ 141 ]
Por man bash
sabermos que 141 significa que recebeu o sinal 13, e por man 7 signal
isso significa que houve um sinal SIGPIPE gerado. Em man 7 pipe
lemos que
[i]se todos os descritores de arquivo referentes à extremidade de leitura de um pipe tiverem sido fechados, então a
write(2)
fará com que um sinal SIGPIPE seja gerado para o processo de chamada.
Então concluo que no segundo caso "todos os descritores de arquivo que se referem ao fim de leitura de um pipe foram fechados", seja lá o que isso deva significar para o /bin/echo
. Mas por que a saída é diferente no caso do Bash echo
?