Sé cómo redirigir a un archivo y usar tee; en un nivel básico Entonces
$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.
$ outanderr 1>file # redirect stdout to a file, display stderr
stderr
$ outanderr 2>file # redirect stderr to a file, display stdout
stdout
$ outanderr 1>file 2>&1 # redirect both to a file, display nothing
$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout
$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr
La pregunta es: qué escribir en lugar de los signos de interrogación para obtener el resultado a continuación:
$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr
Constaints:
- Asumiendo bash.
- El pedido debe mantenerse en el archivo.
- Los contenidos de stderr se muestran en tiempo real línea por línea, es decir, sin almacenamiento en búfer.
- Se pueden usar archivos de script separados.
- La magia puede ser necesaria.
bash
files
io-redirection
TWiStErRob
fuente
fuente
outanderr
programa tienes?outanderr
solo hay un alias que imprime una línea en stdout y otra en stderr. La idea (si es posible) es crear una solución genérica que pueda funcionar con cualquier programa, sin modificarlos.Respuestas:
Para pruebas fáciles:
Editar 1:
Esto funciona escribiendo stdout (solo) en el archivo, haciendo stdout más estéril para que atraviese la tubería y haciendo que tee escriba su salida en el mismo archivo.
Ambas escrituras se deben hacer en modo anexar (en
>>
lugar de>
), de lo contrario, ambas sobrescribirán la salida de las demás.Como la tubería es un búfer, no hay garantía de que la salida aparezca en el archivo en el orden correcto. Esto ni siquiera cambiaría si una aplicación estuviera conectada a ambos descriptores de archivo (dos canales). Para un orden garantizado, ambas salidas tendrían que pasar por el mismo canal y estar marcadas respectivamente. O necesitarías algunas cosas realmente elegantes:
/dev/null
. Las salidas de la aplicación se separarían ejecutándolastrace -f -s 32000 -e trace=write
. Tendría que revertir el escape en ese caso. No es necesario decir que la aplicación no se ejecuta más rápido al rastrearse.fuente
stdout
ystderr
quetee
, o me estoy perdiendo algo? Creo que el requisito del OP estee
stderr
solo.