Escribir en dos archivos simultáneamente en Bash con tee

¿Como puedes hacer para que la salida de la ejecución de una herramienta aparezca en pantalla y se guarde en un archivo a la vez?. La respuesta la tienes en tee. Puede ser que ahora mismo no le encuentres utilidad, sin embargo, es algo que se utiliza con mas frecuencia de lo que puedes imaginar. Es mas, te diría, que es muy probable que tu lo hayas utilizado en mas de una ocasión. Seguro que en algún momento has guardado un repositorio desde el terminal, o has escrito en un archivo donde no tenías permisos, y necesitabas ganar derechos de administrador. En estos casos has tenido que utilizar en algún momento tee. Sobre todo, para el caso de implementar tus propios scripts, esta herramienta te va a ser de gran utilidad.

Escribir en dos archivos simultáneamente en Bash con tee

tee

Como ya te he adelantado en la introducción, tee es una herramienta que lee de la entrada estándar y escribe en la salida estándar y en uno o mas salidas a definir. Básicamente se trata de recoger la salida de una aplicación y no solo mostrarlo en el terminal (la salida estándar), si no, poder guardarlo en un archivo.

Como ya te puedes imaginar esto se utiliza básicamente con pipes y filtros, tal y como puedes ver en el tutorial sobre el terminal. En el tutorial encontrarás dos capítulos específicos sobre redirigir entrada y salida en Linux y sobre filtros.

Por ejemplo, puedes listar un determinado directorio aplicando grep, y antes de esto guardarlo en un archivo,

ls -lah | tee file.txt | grep python

De esta forma en el archivo encontrarás todo el listado de archivos que se encuentran en el directorio en curso, mientras que por pantalla solo verás los filtrados por grep python. Si lo que quieres, es guardar los archivos después del filtro, la instrucción a ejecutar sería,

ls -lah | grep python | tee file.txt

Uso de tee

El uso de tee, es el que has podido ver hasta el momento, con la salvedad de que puedes escribir en tantos archivos como necesites. Así, el último ejemplo redirigido a varios archivos,

ls -lah | grep python | tee file1.txt file2.txt file3.txt

Por otro lado, tee admite un par de opciones,

  • -a esta primer opción te resultará de gran utilidad, y además debes tener muy en cuenta. Lo que hace es añadir la salida al contenido del archivo. En otro caso, lo que hará será reemplazar el contenido. Por esto te comento sobre la importancia de esta herramienta.
  • -i ignora interrupciones.

La ejecución de tee devolverá,

  • 0 si la entrada a la herramienta se copia a todos los archivos de salida
  • >0 en el caso de que se haya producido cualquier error.

Algunos ejemplos interesantes

Te indico algunos ejemplos, para que veas las opciones de esta herramienta, aunque con lo que has visto hasta el momento ya te has hecho una muy buena idea de sus posibilidades.

  • ls -lah | tee salida.txt te muestra por pantalla el contenido del directorio y también lo guarda en salida.txt.
  • ls -lah 2>&1 | tee salida.txt en este caso no solo la salida estándar sino que también los errores se muestran tanto por pantalla como se guardan en el archivo.
  • ls -lah 2>&1 | tee -a salida.txt igual que el caso anterior, pero en lugar de reemplazar el contenido, en este caso lo añadimos.
  • ls -la | tee salida.txt | grep -v "salida" > salida2.txt aquí redirigimos la salida a un archivo, mientras que la otra salida, la filtramos y la redirigimos a otro archivo. No es que este ejemplo nada del otro mundo, pero lo puedes probar de inmediato y sacar tus propias conclusiones sobre el potencial de esta herramienta.
  • ls -la | tee salida1.txt salida2.txt salida3.txt. Esta opción te la he comentado anteriormente. Se trata de que el mismo resultado irá a todos los archivos.
  • echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/so urces.list.d/sublime-text.list nos permite el escalado de servicios y escribir en el archivo. Este es precisamente el ejemplo que te he comentado en la introducción de este artículo.

Ignorando interrupciones

Por último está el asunto de la opción -i. Esta opción te permite que cuando realices una interrupción el resultado de la operación sea un 0, es decir, no se produzca un error.

Por ejemplo, si ejecutas find /. 2>/dev/null 1>archivo.txt y detienes la ejecución con Ctrl+C verás que te devuelve un error. Es importante que detengas la ejecución porque estás listando todo el contenido de tu equipo en un archivo. Un archivo que puede llegar a ser muy, pero que muy grande.

Por el contrario si ejecutas find /. 2>/dev/null | tee -i archivo.txt además de ver el resultado del listado de todos los archivos de tu equipo, podrás detener la ejecución sin que te devuelva un error.

Si no quisieras ver todos los archivos por pantalla, en lugar de ejecutar la instrucción anterior, tienes que ejecutar find /. 2>/dev/null | tee -i archivo.txt 1>/dev/null.

Conclusión

Ya has visto las posibilidades que te ofrece tee para escribir a varios archivos de forma simultánea, para hacer diferentes operaciones en una única instrucción y para escalar permisos a la hora de escribir en un archivo cuando lo necesites. Se trata de una poderosa herramienta que seguro te saca de mas de un apuro.


Imagen de portada de Joanna Kosinska en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada.