¿Hay alguna manera de redirigir la salida de un programa y aún así hacer que vaya a stdout?

24

Bueno. Si quisiera redirigir la salida de un programa a un archivo, haría algo como esto

prog > file

Si quisiera redirigir stdout y stderr a ese archivo, entonces lo haría

prog > file 2>&1

Esto está muy bien si quieres que la salida vaya al archivo. Pero, ¿qué sucede si desea que la salida vaya al archivo y aún así ir a stdout / stderr? Por lo tanto, la salida se guarda en el archivo, pero aún se puede ver en la consola mientras se ejecuta el programa. ¿Hay una manera de hacerlo? Y si es así, ¿cómo?

Jonathan M Davis
fuente
Terminología: Te refieres y aún vas a la terminal . stdoutes el descriptor de archivo 1, y foo > some_filesignifica que un descriptor de archivo de solo escritura abierto en some_filesto es foo. stdout siempre va a stdout.
Peter Cordes

Respuestas:

39

teeexiste para este propósito; toma un argumento de nombre de archivo y escribe los datos que lee de stdin tanto en stdout como en el archivo:

$ prog 2>&1 | tee file
Michael Mrozek
fuente
10
Y para el suplemento fiesta 4 ternura: prog |& tee file.
Tobu
1
También puede reemplazar 'archivo' con una tubería con nombre ...
Kevin Cantu
@KevinCantu: Una tubería con nombre es solo un tipo de archivo; Esto es Unix donde todo es un archivo. También puede prog |& tee /dev/tty > file, lo que puede ser útil en medio de una tubería, por ejemplo, foo |& tee /dev/tty | sed 's/.*\r//' > foo.logpara ver las actualizaciones de progreso de la línea de estado en su terminal, pero filtrarlas de un archivo de registro. O úselo para depurar una tubería que está pirateando al permitirle ver los datos en ese punto.
Peter Cordes