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:
- La salida combinada del orden de ejecución de stdout y stderr (es decir, la salida anterior).
- Sólo la salida estándar
- 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 out
y err
son los deseados, pero el archivo combinado both
no 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 output
funció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.