El comando tee

AdriMcGrady 24/03/2023

El comando tee

Toca hablar de comandos útiles para la terminal en Linux o UNIX, y en concreto de uno en particular: tee. Se trata de un comando cuyo funcionamiento es bastante simple, pero es directamente proporcional a su utilidad. Básicamente lo que hace es leer de la entrada estándar y escribir a la salida estándar y a uno o más ficheros. ¿Y para que sirve esto? Pues para algo tan sencillo y útil, como por ejemplo, ver la salida de un comando o script a la vez que la estamos volcando a un fichero.

Instalando tee

Antes de explicar como se usa, lo primero que os tengo que decir que el comando suele venir en el paquete coreutils de tu distro. Es un paquete de los básicos de todas las distribuciones. Así que lo normal es que lo tengas instalado, pero si no es tu caso, la forma de instalarlo sería esta:

# Debian/Ubuntu 
apt install coreutils

# RedHat/Centos/OracleLinux
dnf install coreutils

Usando tee

Como curiosidad os diré que, si no estoy mal informado, su nombre viene de lo que se ha llamado una T de tuberías de toda la vida. Y la verdad es que tiene todo el sentido del mundo porque nuestro tee hace fundamentalmente lo que una T en cualquier especialidad. De hecho, lo común es usar tee junto con pipe o tubería a la salida de otro comando.

El uso básico de tee es bastantes simple:

tee [OPCIONES] [FICHERO DE SALIDA]

El fichero de salida puede ser sólo uno o varios, y en el comportamiento por defecto es sobreescribir el fichero de salida.

En cuanto a las opciones, las más útiles del comando son las siguientes:

  • -a: Como ya he indicado, por defecto tee sobrescribe el fichero de salida que le hemos indicado. Pero con esta opción, el comportamiento cambia para añadir al final del fichero.
  • -i: Esta opción sirve para ignorar las interrupciones. Ahora veremos usos típicos de tee, pero el más común es tras un comando con un pipe. Esta opción permite que el comando tee acabe de manera ordenada cuando queremos cortar la ejecución del comando fuente de los datos con CTRL+C.

Ejemplos de uso

Una vez explicada la sintaxis y las opciones, podemos pasar a los usos más comunes del comando tee en nuestra terminal. Podemos empezar por el ejemplo de uso más habitual, es decir, mandar la salida de un comando o un script a un fichero mientras mantenemos la posibilidad de seguir mostrándola por la salida estándar.

# Ejecutar un comando, ver su salida estándar y guardarla a la vez un un fichero.
echo "1 - Hola soy un texto que se verá por la salida estándar y se guardará en un fichero" | tee prueba-tee.log

# Ejecutar un comando, ver su salida estándar y a la vez añadirla al final de un un fichero.
echo "2 - Hola soy un texto que se verá por la salida estándar y se guardará en un fichero" | tee -a prueba-tee.log

En la siguiente animación se puede ver el funcionamiento de los comandos anteriores y su resultado.

gif comando tee

Pero… ¿y si el comando que estamos ejecutando lanza algún error por la salida de errores? Pues con el ejemplo anterior, el error se mostraría por pantalla pero no se guardaría en el fichero indicado a tee. Sin embargo, en muchas veces puede ser útil, que tee guarde las salidas estándar y de error en el mismo fichero. Por ejemplo, cuando interesa dejar lanzado algo y guardar toda la salida para revisarla después. Para este caso, os muestro el siguiente ejemplo:

# Comando sin errores
echo "El comando tee en noroute2host" 2>&1 | tee -a prueba-tee-errores.log

# Comando con errores
bash SoyUnComandoQueNoExiste 2>&1 | tee -a prueba-tee-errores.log

La clave está en 2>&1 que tiene como resultado redirigir la salida de errores a la estándar. Por lo que al final, tee sigue haciendo lo que hace normalmente, pero ahora la salida estándar que se vuelca al fichero como siempre, ya incluye la salida de errores.

gif comando tee

Para terminar con los ejemplos, os dejo uno con la opción -i. Al leer la documentación de que es lo que hace esta opción nos puede parecer confuso, pero con un ejemplo se ve mucho más claro.

# Ejecución de una espera de 100 segundos que se para con CTRL+C
adrimcgrady@nanopifire3:~/noroute2host-pruebas$ sleep 100 | tee prueba-tee-opcion-i.log
^C

# Código de salida del comando anterior
adrimcgrady@nanopifire3:~/noroute2host-pruebas$ echo $?
130

# Misma operación usando la opción -i del comando tee
adrimcgrady@nanopifire3:~/noroute2host-pruebas$ sleep 100 | tee -i prueba-tee-opcion-i.log
^C

# Código de salida del comando anterior
adrimcgrady@nanopifire3:~/noroute2host-pruebas$ echo $?
0

Como se puede ver, si paramos la ejecución del comando o script fuente de los datos de tee mediante una interrupción, en este caso CTRL+C, el resultado del comando completo no es 0, lo cuál implicaría que no terminó correctamente. Sin embargo, al usar la opción -i tee termina con código de error 0.

Enlaces de interés:

Artículo anterior Artículo siguiente

Artículos relacionados: