tuberias salida redirigir redireccionar redireccionamiento por pipes mensajes los guardar generados filtros fichero estandar error envían entrada ejemplos dónde defecto comandos comando archivo linux bash file-io io stdout

salida - tuberias y filtros en linux



Cómo redirigir la salida a un archivo y stdout (9)

Algo para añadir ...

El paquete unbuffer tiene problemas de soporte con algunos paquetes en las versiones de fedora y redhat unix.

Dejando a un lado los problemas

Los siguientes me funcionaron

bash myscript.sh 2>&1 | tee output.log

Gracias y sus entradas me ahorraron mucho tiempo ...

En bash, llamar a foo mostraría cualquier salida de ese comando en la salida estándar.

Llamar a foo > output redirigiría cualquier salida de ese comando al archivo especificado (en este caso, ''output'').

¿Hay una manera de redirigir la salida a un archivo y hacer que se muestre en la salida estándar?


El comando que desea se llama tee :

foo | tee output.file

Por ejemplo, si solo te importa la salida estándar:

ls -a | tee output.file

Si quieres incluir stderr, haz:

program [arguments...] 2>&1 | tee outfile

2>&1 redirige el canal 2 (error estándar / estándar) al canal 1 (salida estándar / estándar), de modo que ambos se escriben como estándar. También se dirige al archivo de salida dado a partir del comando tee .

Además, si desea adjuntar al archivo de registro, use tee -a como:

program [arguments...] 2>&1 | tee -a outfile


La camiseta es perfecta para esto, pero esto también hará el trabajo.

ls -lr / > output | cat output


Otra forma que funciona para mí es,

<command> |& tee <outputFile>

como se muestra en el manual de gnu bash

Ejemplo:

ls |& tee files.txt

Si se usa ''| &'', el error estándar de command1 , además de su salida estándar , se conecta a la entrada estándar de command2 a través de la tubería; es taquigrafía para 2> & 1 |. Esta redirección implícita del error estándar a la salida estándar se realiza después de cualquier redirección especificada por el comando.

Para más información, consulte la redirection


Principalmente puede usar la solution , pero si no desea sobrescribir el archivo de salida, debe escribir tee con la opción -a de la siguiente manera:

ls -lR / | tee -a output.file


Respuesta de bono ya que este caso de uso me trajo aquí:

En el caso de que necesite hacer esto como otro usuario

echo "some output" | sudo -u some_user tee /some/path/some_file

Tenga en cuenta que el eco ocurrirá a medida que usted y la escritura del archivo sucederán como "some_user", lo que NO funcionará es si ejecutara el eco como "some_user" y redirija la salida con >> "some_file" porque el redireccionamiento del archivo sucederá como tu.

Sugerencia: tee también admite agregar con el indicador -a, si necesita reemplazar una línea en un archivo como otro usuario, podría ejecutar sed como el usuario deseado.


el uso de tail -f output debería funcionar.


< command > |& tee filename # esto creará un archivo "filename" con el estado del comando como contenido. Si ya existe un archivo, eliminará el contenido existente y escribirá el estado del comando.

< command > | tee >> filename < command > | tee >> filename # esto agregará el estado al archivo pero no imprime el estado del comando en standard_output (pantalla).

Quiero imprimir algo usando "echo" en la pantalla y adjuntar los datos de eco a un archivo

echo "hi there, Have to print this on screen and append to a file"


$ program [arguments...] 2>&1 | tee outfile

2>&1 vuelca las corrientes stderr y stdout. tee outfile toma el flujo que recibe y lo escribe en la pantalla y en el archivo "outfile".

Esto es probablemente lo que la mayoría de la gente está buscando. La situación probable es que algún programa o script esté trabajando duro durante mucho tiempo y produciendo una gran cantidad de resultados. El usuario desea verificarlo periódicamente para ver el progreso, pero también desea que la salida se escriba en un archivo.

El problema (especialmente cuando se mezclan stdout y stderr streams) es que hay confianza en que los streams sean eliminados por el programa. Si, por ejemplo, todas las escrituras en stdout no se borran, pero todas las escrituras en stderr se borran, terminarán fuera de orden cronológico en el archivo de salida y en la pantalla.

También es malo si el programa solo genera 1 o 2 líneas cada pocos minutos para informar el progreso. En tal caso, si la salida no fue eliminada por el programa, el usuario ni siquiera vería ninguna salida en la pantalla durante horas, ya que ninguna de ellas sería empujada a través de la tubería durante horas.

Actualización: El programa unbuffer , parte del paquete expect , resolverá el problema del almacenamiento en búfer. Esto hará que stdout y stderr escriban en la pantalla y el archivo inmediatamente y los mantengan sincronizados cuando se combinan y se redirigen al tee . P.ej:

$ unbuffer program [arguments...] 2>&1 | tee outfile