Si alguna vez usa tuberías y redirecciones bajo su shell de Linux, es probable que a veces también necesite hacer uso de la tee
utilidad.
¿Qué hace Tee?
Un comando como
mostrará el contenido de su directorio actual. En otras palabras, muestra estos contenidos en stdout (salida estándar), que normalmente es su pantalla, o para ser más precisos, la pantalla de su terminal virtual.
Un comando como
no mostrará nada en su pantalla. Eso es porque el >
sign redirige toda la salida a un archivo en lugar de mostrarla en la salida estándar. file123 ahora se llenará con los contenidos que se mostraban previamente en su pantalla.
Para mostrar el contenido de su directorio en la pantalla y escribirlo en un archivo, use dos comandos. Con tee
puedes hacer ambas cosas a la vez.
¿Por qué usar Tee si puede ejecutar un comando similar dos veces?
En el ejemplo anterior, obviamente no necesita tee si puede ejecutar ls
normalmente y luego ejecútelo nuevamente y redirija la salida a un archivo. Sin embargo, encontrará situaciones en las que la salida será única. Imagine un escenario en el que intenta diagnosticar un problema. Tu corres diagnose | tee error.log
. Los errores que obtenga pueden ser únicos. Desea que se muestren en la pantalla para que pueda ver lo que sucede a medida que prueba las cosas. Pero también desea que esos errores se guarden en un archivo, para que pueda revisarlos más tarde o pegar el resultado en un foro de discusión y preguntarle a la gente al respecto.
Otra situación, que se encuentra a menudo, en la que puede necesitar te, es esta: desea escribir la salida de un comando en una ubicación donde solo el usuario raíz puede leer o escribir. Esto no funcionará.
/sbin/blkid > /root/somefile
Entonces, puede pensar: «Bueno, por supuesto, ¡solo use sudo!» Y te sorprenderá que esto tampoco funcione:
sudo blkid > /root/somefile
Eso es porque después sudo blkid
se ejecuta, todavía está conectado como su usuario normal, no root. Y su shell (generalmente bash), intenta escribir en /root/somefile
con sus credenciales de usuario habitual. Para resolver esto, puedes usar tee:
/sbin/blkid | sudo tee /root/somefile
Adición de texto y errores de redireccionamiento
tee es un comando útil pero simple; un basico command | tee somefile
será suficiente la mayoría de las veces. Sin embargo, hay dos escenarios que puede encontrar que requerirán estos consejos.
Lo primero que debe saber es que tee, por defecto, siempre sobrescribe un archivo. Si tu corres
y entonces
el segundo comando sobrescribirá el contenido de algún archivo y solo verá el contenido del último comando ejecutado. Para cambiar este comportamiento, puede hacer que te agregue texto en lugar de sobrescribirlo. Para hacerlo, simplemente use el -a
interruptor de comando
Lo segundo que debe saber es que no todos los resultados son iguales. Los mensajes de error se tratan de manera diferente y, aunque aparecen en la pantalla, no se consideran estándar, por lo que no serán detectados por el tee. (Se consideran stderr). Aquí hay un ejemplo en grep.
grep -r L2TP /etc | tee somefile
Se mostrará algo como la siguiente imagen.
Los mensajes de permiso denegado se escriben en stderr. Lo único que se escribe en stdout es el texto resaltado. Es por eso que notará que el contenido de «somefile» es lo que se muestra en la imagen de abajo.
En este caso, donde se usa grep para buscar texto, es útil que los mensajes de error no se redirijan al archivo. Simplemente llenarían el archivo con basura innecesaria. Solo desea ver los resultados encontrados. Pero cuando necesite los mensajes de error, use 2>&1
que redirige stderr a stdout.
grep -r L2TP /etc 2>&1 | tee somefile
Con este comando notará que algún archivo ahora también contiene los mensajes de error.
Conclusión
Con suerte, este tutorial cubre todo lo que necesita para aprovechar al máximo el comando tee. Pero si se encuentra con una situación en la que se queda atascado con el tee, deje un comentario a continuación y es posible que podamos ayudarlo.