Con bash, ¿cómo copio stderr y stdout en un archivo de registro y también los dejo en la consola?
Me gustaría hacer esto dentro del script en sí usando un ejecutivo.
Lo intenté con
exec &>> log.out
echo "This is stdout"
echo "This is stderr" >&2
Pero lo anterior no imprime nada en la consola. ¿Cómo puedo lograr esto en bash?
Respuestas:
Que busca
tee
.Ver
man tee
para más detalles.Para combinarlo
exec
, debe usar la sustitución del proceso . (Verman bash
para más detalles).fuente
exec 2>&1 | tee -a log.out
solo imprime en la consola, nada en el archivo de registro. ¿Quizás no estoy usando la sintaxis correcta?tee
en combinación con la sustitución de procesos .the-script | wc -l
por ejemplo, eso también contará las líneas de error y no verá los errores.Tu puedes hacer:
También puedes escribirlo como:
Pero debido a que bash no está esperando que esos procesos comiencen
>(...
), eso tiene el efecto desagradable de algunas veces enviar algo al terminal después de que el comando ha regresado, lo que puede tener efectos aún más desagradables (como descartar silenciosamente esa salida) si el atributo "tostop" del terminal Está encendido.En cualquier caso, al hacer
stdout
una tubería en ambas soluciones, y debido a que dos comandos emiten de forma independiente los mensajes de salida y error, esto afectará el almacenamiento intermedio de salida y el orden en que se muestran los mensajes de salida y error.fuente
tee -a log >&2 3>&-
Sé que esta es una publicación antigua, pero ¿por qué no hacer esto?
Y, por supuesto, si desea stdout, puede imprimir regularmente.
Puede hacer esto con cualquier combinación de secuencias que desee, simplemente usando esos dos comandos básicos.
Sé que vine aquí y no obtuve una respuesta fácil de entender / implementar, espero que esto sea de ayuda para alguien más que está luchando.
Por cierto, para novatos como mi yo anterior, todo lo que hace el
tee
comando es enviar la entrada stdin tanto a stdout como a los archivos especificados como argumentos posteriores.-a
significa anexar, por lo que no sobrescribe el archivo con cada uso del comando. Si tiene más preguntas, creo que este es un recurso muy útil para aprender rápidamente bash.fuente
Una forma más de hacerlo es usar redirecciones dentro de las funciones.
Aquí tenemos una
main
función que invoca todas las demás funciones. Ahora redireccionandoSTDOUT
ySTDERR
demain
función atee
.fuente