Tenemos la mejor información que descubrimos en todo internet. Nosotros esperamos que te sea útil y si quieres aportar cualquier detalle que nos pueda ayudar a mejorar hazlo con total libertad.
Solución:
Ver “Tubería rota” en esta situación es raro, pero normal.
cuando corres type rvm | head -1
bash ejecuta type rvm
en un proceso, head -1
en otro.1 El estándar de type
está conectado al extremo de “escritura” de un tubola entrada estándar de head
hasta el final de “lectura”. Ambos procesos se ejecutan al mismo tiempo.
Él head -1
proceso lee datos de stdin (generalmente en fragmentos de 8 kB), imprime una sola línea (según el -1
opcional) y sale, lo que hace que se cierre el extremo de “lectura” de la tubería. Desde el rvm
La función es bastante larga (alrededor de 11 kB después de ser analizada y reconstruida por bash), esto significa que head
sale mientras type
todavía tiene algunos kB de datos para escribir.
En este punto, desde type
está tratando de escribir en una tubería cuyo otro extremo ha sido cerrado: un roto tubería: la función write() que llamó devolverá un error EPIPE, traducido como “tubería rota”. Además de este error, el núcleo también envía la señal SIGPIPE a type
que por defecto mata el proceso inmediatamente.
(La señal es muy útil en shells interactivos, ya que la mayoría de los usuarios no quieren que el primer proceso siga ejecutándose e intentando escribir en ninguna parte. Mientras tanto, los servicios no interactivos ignoran SIGPIPE; no sería bueno que un demonio de ejecución prolongada mueren en un error tan simple, por lo que encuentran el código de error muy útil).
Sin embargo, la entrega de la señal no es 100 % inmediata y puede haber casos en los que write() devuelva EPIPE y el proceso continúe ejecutándose durante un breve período de tiempo antes de recibir la señal. En este caso, type
obtiene tiempo suficiente para notar la escritura fallida, traducir el código de error e incluso imprimir un mensaje de error en stderr antes de que SIGPIPE lo elimine. (El mensaje de error dice “-bash: tipo:” ya que type
es un comando integrado de bash en sí mismo.)
Esto parece ser más común en sistemas multi-CPU, ya que el type
El proceso y el código de entrega de señales del kernel pueden ejecutarse en diferentes núcleos, literalmente al mismo tiempo.
Sería posible eliminar este mensaje parcheando el type
incorporado (en el código fuente de bash) para salir inmediatamente cuando recibe un EPIPE de la función write().
Sin embargo, no es nada de qué preocuparse, y no está relacionado con su rvm
instalación de ninguna manera.
Puedes arreglar una tubería rota a expensas de otro proceso insertando tail -n +1
en tu tubería, así:
tipo rvm | cola -n +1 | cabeza -1
Él +1
dice tail
para imprimir la primera línea de entrada y todo lo que sigue. La salida será exactamente la misma que si tail -n +1
no estaba allí, pero el programa es lo suficientemente inteligente como para verificar la salida estándar y cierra la tubería limpiamente. No más tuberías rotas.
Él write error: Broken pipe
El mensaje se refiere a un proceso de escritura que intenta escribir en una tubería sin lectores en el extremo de lectura de esa tubería y la circunstancia especial de que el SIGPIPE
la señal está configurada para ser ignorada por el proceso actual o el principal. Si fue el proceso principal el que estableció SIGPIPE
para ser ignorado, no es posible que el proceso secundario lo deshaga nuevamente en un shell no interactivo.
Sin embargo, es posible matar type rvm
cuando head -1
termina usando subcapas explícitas. De esta manera podemos fondo type rvm
enviar typepid
hacia head -1
subshell y luego implementar una trampa en EXIT
ahi para matar type rvm
explícitamente.
trap "" PIPE # parent process sets SIGPIPE to be ignored
bash # start child process
export LANG=C
# create a fake rvm function
eval "
rvm()
$(printf 'echo line of rvm code %sn' 1..10000)
"
# rvm is a function
# bash: type: write error: Broken pipe
type rvm | head -1
# kill type rvm when head -1 terminates
# sleep 0: do nothing but with external command
( (sleep 0; type rvm) & echo $! ; wait $! ) |
(trap 'trap - EXIT; kill "$typepid"; exit' EXIT; typepid="$(head -1)"; head -1)
Sección de Reseñas y Valoraciones
Tienes la opción de auxiliar nuestra misión poniendo un comentario y puntuándolo te estamos eternamente agradecidos.