Considere el siguiente comando:
bash -c "echo x; cat 1" | tee 1
.
Tengo entendido que se bifurcaría a un nuevo shell, escribiría x
en stdout, escribiría file 1 not found
en stderr, saldría y devolvería el control al proceso padre, y escribiría x
en stdout y to 1
. Por lo tanto, esperaría que el resultado final fuera x
, y el archivo 1
contiene exactamente la cadena x
.
Sin embargo, éste no es el caso. En realidad, el archivo 1
generalmente contiene al menos dos instancias x
y, a veces, miles de líneas de x
s. En una prueba por lotes de ejecutar el comando diez mil veces, el número medio de x
s escritos en el archivo fue 52.3, y la mediana fue 1. ¿Qué mecánico está causando esto? ¿Qué distribución de probabilidad modela este comportamiento? Sospecho que es condicionalmente geométrico y por lo demás uniforme.
tee
ha abierto el archivo para escribir antes de abrirlocat
para leer, puede obtener muchosx
-es en el archivo. En ese caso, el "ciclo" terminaría siempre que lascat
lecturas fueran más rápidas que lastee
escrituras, llegando al final del archivo.x
s escritos en el archivo fue de 4.35. Supongo que dependerá mucho de la carga de la máquina.Respuestas:
Esta es muy curiosa, así que traté de investigarla con la ayuda de strace. Ejecutó su comando en un bucle 1000 veces:
Encontré el archivo con la mayoría de las líneas (
wc -l */1 | sort -nr | head -n2
) y verificó el correspondientetrace.log
. Ciertamente puedo ver muchos:Donde 7567 es
tee 1
y 7568 escat 1
. Los dos definitivamente se alternan, así que sí, como se sospecha, se trata del momento de la ejecución (e imagino el cambio de contexto) de los dos comandos.fuente