Estou tentando entender melhor o SIGPIPE no Linux.
Eu executei este experimento: { ls -al /tmp/ ; echo "$?" 1>&2 ; } | head
e ele ecoa 141
o que eu entendo ser um código de saída fornecido para processos que saem com SIGPIPE
Anteriormente, eu fazia muito isso sem entender as nuances SIGPIPE
e geralmente executo set -eEuo pipefail
isso, estava tentando entender por que meu o código não falhava o tempo todo devido a canos quebrados... Então fiz esse outro experimento: ( set -o pipefail; { ls -al /tmp/ ; echo "$?" 1>&2 ; } | head; )
e obtive um 0 no eco daquela vez... então, quando pipefail
está ativado, isso significa que SIGPIPE
está suprimido? ou estou entendendo mal o que está acontecendo aqui?
ls
pode conseguir gravar toda a sua saída antes dehead
sair e quebrar o canal, mesmo que a saídals
seja maior do que ahead
impressa. Isto é porque:head
pode ler mais do que eventualmente imprimir,SIGPIPE é acionado pela gravação real em um canal quebrado. Se
ls
conseguir escrever toda a sua saída antes dehead
sair, não haverá nenhum ato de escrita que acione o SIGPIPE.Ou
ls
pode não conseguir gravar toda a sua saída antes dehead
sair. Então ele tentará escrever mais e obterá o SIGPIPE.Como
ls
ehead
rodando em paralelo, acho que em geral existe uma condição de corrida. Pode acontecer que alguma saída específica dols
SIGPIPE acione ou não, aleatoriamente.Tente com
yes
em vez dels …
:ou
yes
gera uma saída que não termina sozinha, portanto apóshead
as saídas sempre haverá um ato de escrita que aciona o SIGPIPE. Cada um dos comandos acima lhe dará141
certeza.Isto não tem nada a ver com
pipefail
.