Pregunta:
Si hago un
svn log | head
después de la décima línea de salida, aparece un mensaje de error:
svn: Write error: Broken pipe
¿Que está pasando aqui? No he visto ningún otro comando hacer esto cuando se usa con la head
. ¿Subversion es hostil al paradigma de filtrado de Unix?
Respuesta:
Cuando escribe en una tubería cuyo otro extremo se ha cerrado, normalmente recibe una señal SIGPIPE y muere. Sin embargo, si elige ignorar esa señal, como lo hace svn
, entonces la write
regresa con -1
y errno
establecido en EPIPE
cuya traducción al inglés es "Broken pipe". Y svn
elige mostrar ese mensaje de error cuando no puede escribir algo en su salida estándar.
head
termina después de haber escrito 10 líneas desde su entrada y, como resultado, cierra la tubería. svn
no podrá escribir más en esa tubería. La mayoría de las aplicaciones mueren silenciosamente como comportamiento predeterminado cuando no ignoran SIGPIPE. svn
por alguna razón (tal vez porque necesita hacer cosas adicionales antes de morir) elige ignorar el SIGPIPE y determina que no puede escribir más en la tubería verificando el estado de error de la write
en la tubería.
Obtienes el mismo error con:
bash -c 'trap "" PIPE; while echo foo; do :;done' | head
Ver:
strace -e write seq 10000 | head
(en Linux) para ver cuál es el comportamiento predeterminado cuando no está ignorando SIGPIPE.