Fusione stdout y stderr y cree copias de cada uno por separado

Fusione stdout y stderr y cree copias de cada uno por separado

Mi objetivo se explica mejor con el ejemplo. Para comenzar, aquí hay una función que producirá una salida de muestra, tanto en stdout como en stderr:

output() {
  printf '%s\n' 1 2
  printf '%s\n' errA errB 1>&2
  printf '%s\n' 3 4
}

Si ejecuta esto solo, ambas secuencias se imprimirán en la terminal en el orden de ejecución:

$ output
1
2
errA
errB
3
4

Ahora bien, esta función es simplemente un marcador de posición para representar la salida (stdout y stderr) de algún script arbitrario que deseamos registrar. Específicamente, queremos crear tres registros diferentes:

  1. La salida combinada del orden de ejecución de stdout y stderr (es decir, la salida anterior).
  2. Sólo la salida estándar
  3. Sólo la salida estándar

La solución más cercana que se me ocurrió es esta:

$ { output > >(tee out) 2> >(tee err >&2); } > both 2>&1
$ ls
both  err  out
$ cat both
errA
errB
1
2
3
4
$ cat out
1
2
3
4
$ cat err
errA
errB

Como puede ver, los archivos outy errson los deseados, pero el archivo combinado bothno mantiene el orden de ejecución.

¿Hay alguna manera de crear los 3 archivos de registro deseados simultáneamente?

Como pregunta adicional, ¿está realmente garantizada la salida del orden de ejecución cuando se ejecuta la outputfunción por sí sola? He intentado ejecutar muchas veces y la salida estándar y el stderr combinados en la terminal son siempre los mismos y en el orden correcto. Pero eso no es lo mismo que una garantía.

información relacionada