He explorado casi todas las preguntas similares disponibles , sin resultado.
Permítanme describir el problema en detalle:
Ejecuto algunos scripts desatendidos y estos pueden producir resultados estándar y líneas de error estándar, quiero capturarlos en su orden preciso como se muestra en un emulador de terminal y luego agregarles un prefijo como "STDERR:" y "STDOUT:".
He intentado usar tuberías e incluso un enfoque basado en epoll en ellas, sin éxito. Creo que la solución está en uso pty, aunque no soy un maestro en eso. También he echado un vistazo al código fuente del VTE de Gnome , pero eso no ha sido muy productivo.
Lo ideal sería utilizar Go en lugar de Bash para lograr esto, pero no he podido. Parece que las tuberías prohíben automáticamente mantener un orden de líneas correcto debido al almacenamiento en búfer.
¿Alguien ha podido hacer algo similar? ¿O es simplemente imposible? Creo que si un emulador de terminal puede hacerlo, entonces no es así, ¿tal vez creando un pequeño programa en C que maneje los PTY de manera diferente?
Idealmente, usaría una entrada asíncrona para leer estos 2 flujos (STDOUT y STDERR) y luego volver a imprimirlos en segundo lugar según mis necesidades, ¡pero el orden de entrada es crucial!
NOTA: Soy consciente de stderred pero no funciona para mí con los scripts de Bash y no se puede editar fácilmente para agregar un prefijo (ya que básicamente envuelve muchas llamadas de sistema).
Actualización: agregado debajo de dos aspectos esenciales
(se pueden agregar retrasos aleatorios de menos de un segundo en el script de muestra que proporcioné para probar un resultado consistente)
Actualización: la solución a esta pregunta también resolvería esta otra pregunta , como señaló @Gilles. Sin embargo, he llegado a la conclusión de que no es posible hacer lo que se pide aquí y allá. Cuando se usan 2>&1
ambas transmisiones se fusionan correctamente en el nivel pty / pipe, pero para usar las transmisiones por separado y en el orden correcto, se debe utilizar el enfoque de stderred que invoca el enganche de syscall y puede verse como sucio de muchas maneras.
Estaré ansioso por actualizar esta pregunta si alguien puede corregir la información anterior.