unix pipe – ¿Por qué Subversion da un error de tubería rota cuando se conecta a la cabeza?

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.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım