![SIGPIPE y fallo de tubería bash](https://rvso.com/image/231080/SIGPIPE%20y%20fallo%20de%20tuber%C3%ADa%20bash.png)
Estoy intentando comprender mejor SIGPIPE en Linux.
Ejecuté este experimento: { ls -al /tmp/ ; echo "$?" 1>&2 ; } | head
y me hace eco 141
, lo cual entiendo es un código de salida que se le da a los procesos que salen con SIGPIPE
Anteriormente, he hecho esto muchas veces sin entender los matices SIGPIPE
y normalmente lo ejecuto set -eEuo pipefail
, estaba tratando de entender por qué mi el código no fallaba todo el tiempo debido a tuberías rotas... Entonces ejecuté este otro experimento: ( set -o pipefail; { ls -al /tmp/ ; echo "$?" 1>&2 ; } | head; )
y obtuve un 0 en el eco esa vez... entonces, cuando pipefail
está habilitado, ¿eso significa que SIGPIPE
está suprimido? ¿O estoy entendiendo mal lo que está pasando aquí?
Respuesta1
ls
puede lograr escribir toda su salida antes de head
salir y romper la tubería, incluso si la salida ls
es más larga de lo que head
se imprime. Esto es porque:
head
puede leer más de lo que eventualmente imprimirá,- y de todos modos hay un amortiguador para la tubería.
SIGPIPE se activa mediante la escritura real en una tubería rota. Si ls
logra escribir toda su salida antes de head
salir, entonces no habrá ningún acto de escritura que active SIGPIPE.
O ls
puede que no logre escribir toda su salida antes de head
salir. Luego intentará escribir más y obtendrá SIGPIPE.
Al ls
correr head
en paralelo, creo que en general hay una condición de carrera. Puede suceder que alguna salida particular de ls
active o no SIGPIPE, de forma aleatoria.
Pruebe con yes
en lugar de ls …
:
{ yes ; echo "$?" 1>&2 ; } | head
o
( set -o pipefail; { yes ; echo "$?" 1>&2 ; } | head; )
yes
genera una salida que no termina por sí sola, por lo que después de head
salir siempre habrá un acto de escritura que activa SIGPIPE. Cada uno de los comandos anteriores te lo dará 141
seguro.
Esto no tiene nada que ver con pipefail
.