Existe una herramienta del paquete coreutils que permite lograr este cometido y se llama tee
. En este artículo demuestro su utilidad.
¿Qué pasa si deseamos ver la salida de un comando en directo, pero al mismo tiempo deseamos que sea guardada en un archivo para examinarla detalladamente más adelante? Como sabemos, al redirigir la salida de un comando hacia un archivo, no somos capaces de visualizarla mientras ocurre.
Veamos un ejemplo listando un directorio:
emi@hal9000:~$ ls -l /usr/local/ total 32 drwxrwsr-x 2 root staff 4096 Nov 13 09:40 bin drwxrwsr-x 2 root staff 4096 May 2 2019 etc drwxrwsr-x 2 root staff 4096 May 2 2019 games drwxrwsr-x 2 root staff 4096 May 2 2019 include drwxrwsr-x 4 root staff 4096 Nov 7 08:48 lib lrwxrwxrwx 1 root staff 9 May 2 2019 man -> share/man drwxrwsr-x 2 root staff 4096 May 2 2019 sbin drwxrwsr-x 8 root staff 4096 Nov 7 08:49 share drwxrwsr-x 2 root staff 4096 Nov 7 10:20 src
Si redirijo la salida hacia un archivo, ésta no se muestra por pantalla:
emi@hal9000:~$ ls -l /usr/local/ > /tmp/salida.txt
Precisamente es así como funcionan las redirecciones en Bash (>
y otras), justamente envían la salida estándar a un archivo:
emi@hal9000:~$ cat /tmp/salida.txt total 32 drwxrwsr-x 2 root staff 4096 Nov 13 09:40 bin drwxrwsr-x 2 root staff 4096 May 2 2019 etc drwxrwsr-x 2 root staff 4096 May 2 2019 games drwxrwsr-x 2 root staff 4096 May 2 2019 include drwxrwsr-x 4 root staff 4096 Nov 7 08:48 lib lrwxrwxrwx 1 root staff 9 May 2 2019 man -> share/man drwxrwsr-x 2 root staff 4096 May 2 2019 sbin drwxrwsr-x 8 root staff 4096 Nov 7 08:49 share drwxrwsr-x 2 root staff 4096 Nov 7 10:20 src
Muchas veces ciertos comandos tienen salidas muy largas que es conveniente guardar en un archivo para examinar cuidadosamente luego, y además para que no se pierda si se llena el buffer de pantalla de la terminal. Pero tal vez al mismo tiempo deseamos ver dicha salida (mientras es guardada en archivo) para verificar el progreso del comando ejecutado. Es decir deseamos enviar la salida hacia un archivo, al mismo tiempo que la visualizamos por pantalla.
El comando tee
permite visualizar una salida mientras es en simultáneo enviada a un archivo. Simplemente es necesario pasar un nombre de archivo como parámetro y se encarga de mostrar la salida por pantalla y escribir la misma salida al archivo:
emi@hal9000:~$ ls -l /usr/local/ | tee /tmp/nueva_salida.txt total 32 drwxrwsr-x 2 root staff 4096 Nov 13 09:40 bin drwxrwsr-x 2 root staff 4096 May 2 2019 etc drwxrwsr-x 2 root staff 4096 May 2 2019 games drwxrwsr-x 2 root staff 4096 May 2 2019 include drwxrwsr-x 4 root staff 4096 Nov 7 08:48 lib lrwxrwxrwx 1 root staff 9 May 2 2019 man -> share/man drwxrwsr-x 2 root staff 4096 May 2 2019 sbin drwxrwsr-x 8 root staff 4096 Nov 7 08:49 share drwxrwsr-x 2 root staff 4096 Nov 7 10:20 src
Es posible comprobar que la misma salida mostrada quedó efectivamente guardada en el archivo:
emi@hal9000:~$ cat /tmp/nueva_salida.txt total 32 drwxrwsr-x 2 root staff 4096 Nov 13 09:40 bin drwxrwsr-x 2 root staff 4096 May 2 2019 etc drwxrwsr-x 2 root staff 4096 May 2 2019 games drwxrwsr-x 2 root staff 4096 May 2 2019 include drwxrwsr-x 4 root staff 4096 Nov 7 08:48 lib lrwxrwxrwx 1 root staff 9 May 2 2019 man -> share/man drwxrwsr-x 2 root staff 4096 May 2 2019 sbin drwxrwsr-x 8 root staff 4096 Nov 7 08:49 share drwxrwsr-x 2 root staff 4096 Nov 7 10:20 src
La opción -a
(append) permite agregar al archivo en lugar de sobrescribirlo. Por ejemplo:
emi@hal9000:~$ ps | tee -a /tmp/nueva_salida.txt PID TTY TIME CMD 5438 pts/1 00:00:00 bash 6551 pts/1 00:00:00 ps 6552 pts/1 00:00:00 tee emi@hal9000:~$ cat /tmp/nueva_salida.txt total 32 drwxrwsr-x 2 root staff 4096 Nov 13 09:40 bin drwxrwsr-x 2 root staff 4096 May 2 2019 etc drwxrwsr-x 2 root staff 4096 May 2 2019 games drwxrwsr-x 2 root staff 4096 May 2 2019 include drwxrwsr-x 4 root staff 4096 Nov 7 08:48 lib lrwxrwxrwx 1 root staff 9 May 2 2019 man -> share/man drwxrwsr-x 2 root staff 4096 May 2 2019 sbin drwxrwsr-x 8 root staff 4096 Nov 7 08:49 share drwxrwsr-x 2 root staff 4096 Nov 7 10:20 src PID TTY TIME CMD 5438 pts/1 00:00:00 bash 6551 pts/1 00:00:00 ps 6552 pts/1 00:00:00 tee