Todos los usos teeque vi en mi vida fueron tales:
do_something | tee -a logfile
O:
do_something_else | tee logfile
¿Está teeinventado para aquellos que no saben que puedes hacer lo mismo con las redirecciones de tubería de shell? Como:
do_something >> logfile
O:
do_something_else > logfile
Es prácticamente lo mismo y se requieren menos golpes de teclado para escribir. ¿Qué características ocultas no veo tee?

teey la redirección de E / S ? El hecho de que diga " redirecciones de tubería de shell como y " no es un punto a su favor, y es un argumento para cerrar como poco claro. Pero en realidad hace múltiples preguntas: "¿Cuál es el propósito de ?", "¿Está inventado para aquellos que no saben que puede hacer lo mismo con las redirecciones de tubería de shell?" Y "¿Qué características ocultas no veo ?". Al menos dos de esas preguntas son demasiado amplias.>>>teeteeteeRespuestas:
Lo que no se ve es que
do_something | tee -a logfilepone en la salidalogfiley la salida estándar, mientrasdo_something >> logfilepone solamente en el archivo de registro.El propósito de
teees producir un escenario de entrada múltiple y salida única, al igual que en un cruce 'T'.EDITAR
Ha habido comentarios sobre cómo
teepermite un uso más descuidado desudo. Esto viene al caso:cat,ddo tal vez mejorbufferproporcionar esta posibilidad con un mejor rendimiento, si no necesita las múltiples salidas. Úseloteepara lo que está diseñado, no para lo que "también puede hacer"fuente
teeincluso puede tomar múltiples argumentos y escribir en muchos archivos a la vez.catde una manera directa en lugar de,teepor ejemplo, enecho /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern?echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_patternno funciona, porque la redirección es procesada por el shell no sudo. En cuanto add,echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_patternfunciona, pero addmenudo es una herramienta dominada capaz de hacer un gran daño, especialmente debajosudo. En cuanto abuffer, no está instalado por defecto en ninguna de las distribuciones basadas en RedHat o Ubuntu que tengo a mano (o MacOS) ...catni el/bin/cattrabajo para mí en esta situación. No importa de dóndecatprovenga: el>shell de nivel superior (no sudo) seguirá manejándolo. La ventaja deteemáscaten esta situación es que permite que el archivo de salida se pase como un parámetro de línea de comandos (y no como un redireccionamiento).ddes sin duda una opción viable, aunque todavía estaría a favorteede estocatyteecomo incorporado? ¿Y qué versión desudopuede ejecutar Shell Builtins?Teeno es inútilTal vez lo sabías de todos modos? Si no, ¡sigue leyendo! O si sabe cómo funciona, pero no está seguro de por qué existe, salte al final para ver cómo encaja con la filosofía de Unix.
¿Qué es el propósito de
tee?En su forma más simple, toma datos en la entrada estándar y los escribe en la salida estándar y en uno (o más) archivos. Se ha comparado con una pieza en T de plomería en la forma en que divide una entrada en dos salidas (y dos direcciones).
Ejemplos
Tomemos su primer ejemplo:
Esto toma el resultado de
do_somethingy lo agrega al archivo de registro, mientras que también lo muestra al usuario. De hecho, la página de Wikipediateetiene este como el segundo ejemplo:El siguiente ejemplo tiene otro uso: escalada de permisos :
¿O tal vez desea tomar la salida de un comando, escribirlo en algún lugar y también usarlo como entrada para otro comando?
(crédito a los ejemplos de uso del comando Tee )
Teetrabaja con la filosofía de Unix:(Crédito a lo básico de la filosofía de Unix )
teese adapta a todos estos:fuente
sudo tee -aes probablemente una innovación más reciente (la vi por primera vez en las guías / wikis de Ubuntu, especialmente para configurar cosas/proc/sys, porque cambiar a Ubuntu fue cuando cambié a unsudosistema basado (cómo Ubuntu está configurado de forma predeterminada) en lugar de usarlosucon un contraseña de root). Creo queteees anteriorsudo, por lo que no es una razón parateeexistir. No es necesarioteepara eso, simplemente es más corto para escribir de forma interactiva quesudo sh -c 'cat > output'.teealimentar dos tuberías, comofoo | tee >(pipe2) | pipe1. Otra forma divertida esffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.logver las actualizaciones de la línea de estado de forma interactiva en el tty, mientras se eliminan las "líneas" que terminan con retorno de carro en lugar de nueva línea para el registro real. (es decir, filtrar las actualizaciones de la línea de estado). En general, puede pegar unatee /dev/ttyen cualquier parte de una tubería como una impresión de depuración.>y configura la redirección antes de que sudo incluso seaexec'd', por lo que definitivamente no es una limitación de sudo que no maneje cosas que nunca ve. :) Normalmente trato de referirme a esto como "el flujo de trabajo de sudo" o algún término similar cuando lo estoy explicando, en lugar de describir sudo.sudo tee -aEn mi humilde opinión es un abuso de tee. Usesudo cat,sudo ddo (con el mejor rendimiento en muchos casos)sudo buffersi no necesita las múltiples salidas.No es lo mismo en absoluto ...
Lo siguiente parece ser algo equivalente, pero no lo son:
La diferencia crítica es que el primero ha escrito los datos solo en el archivo nombrado, mientras que el segundo ha escrito
hien el terminal (stdout) y el archivo nombrado, como se muestra a continuación:teele permite escribir los datos en un archivo y usarlos en una tubería hacia adelante, lo que le permite hacer cosas útiles, como mantener los datos a mitad de camino a través de una tubería:O bien, puede escribir en un archivo con privilegios elevados, sin otorgarle a la tubería privilegios elevados (aquí
echose ejecuta como el usuario, mientrasteeescribe en el archivo comoroot):Con
tee, puede escribir en muchos archivos ( ystdout):También es posible utilizar
execconteegrabar toda la producción de una secuencia de comandos en un archivo, al tiempo que permite un observador (stdout) para ver los datos:fuente
exec > >(tee "$LOGFILE") 2>&1en un script bash que permite que el script genere stdout y stderr a ambos, stdout y al archivo señalado por$LOGFILE.2>&1soltar la salida y errar en archivos txt en Windows.Esta es una camiseta:

Un accesorio de tubería en forma de T. Tiene una entrada y dos salidas separadas.
En otras palabras, divide un tubo en dos; como un tenedor en el camino
Del mismo modo,
teees una tubería (|) que le permite redirigir su entrada estándar a dos salidas separadas.Ejemplo
Por ejemplo, escribe
ls /.Obtendrá una salida que se parece a:
Redireccione la salida a un archivo de texto
ls / > ls.txt, y no se muestra ninguna salida en el shell, solo en el archivo de texto resultante.¿Quiere ver el resultado Y pasarlo a un archivo de texto al mismo tiempo?
Agregue un
teea su pipa (|) es decir:ls / | tee ls.txtCompara los dos:
fuente
No. Resulta que mencionas uno de los pocos ejemplos en los que puedes redirigir al archivo usando
>y>>operadores.Pero Tee puede hacer mucho más. Debido a que te diriges a él, puedes hacerlo a otra cosa.
Un buen ejemplo aparece en la página de Wikipedia :
Básicamente, puede canalizar a Tee, por lo que luego puede canalizar desde Tee a otra cosa. Si todo lo que quiere hacer es escribir un archivo de registro, sí, entonces realmente no necesita Tee.
fuente
teeEstá lejos de ser inútil. Lo uso todo el tiempo y me alegro de que exista. Es una herramienta muy útil si tiene una tubería que desea dividir. Un ejemplo muy simple es que tiene algún directorio$dque desea tar y también quiere hacer hash porque es paranoico (como yo) y no confía en el medio de almacenamiento para mantener los datos de manera confiable. Usted podría escribir en el disco primero y luego desmenuzar, pero eso sería un error si el archivo está dañado antes de que sea hash. Además, tendría que leerlo y si trabaja en archivos de varios cientos de GB de tamaño, sabrá que realmente no desea volver a leerlos si no es necesario.Entonces, lo que hago es simplemente esto:
Crea la bola de alquitrán y la canaliza en T, que luego la canaliza a dos subcapas, en una de las cuales está en hash y en la otra está escrita en el disco.
También es excelente si desea realizar varias operaciones en un archivo grande:
Lee el archivo una vez, lo codifica (para que pueda verificar si todavía está como debería), lo extrae y lo copia en una ubicación diferente. No es necesario leerlo tres veces para eso.
fuente
teeno crea las subcapas; el shell de llamada se ejecutasha5sumycatconecta su salida a los descriptores de archivo que se pasan atee. Además, un uso inútil decat; puede usar la redirección de entrada parateeleer directamentefile.tar.gz.cates amor.cates la vida.< file.tar.gz tee >(sha256sum) ...si le preocupa el orden léxico de las redirecciones. Eso no cambia el hecho de que no hay necesidad de un proceso completamente separado solo para alimentar un solo archivotee.cates relativamente bajo. El costo de 100 GiB adicionales de llamadas al sistema de escritura + lectura definitivamente desperdicia tiempo de CPU adicional y ancho de banda de memoria para su ejemplo propuesto de un archivo enorme. Recuerde que el ancho de banda de la memoria es un recurso compartido en todos los núcleos, sin mencionar la contaminación adicional de la memoria caché L3 de esa copia. En un x86 con la mitigación Specter + Meltdown habilitada, las llamadas al sistema son más caras de lo que solían ser. Estás utilizando una cantidad considerable de tiempo extra de CPU en el transcurso de esa copia. Tampoco>(cat > foo)es más fácil de entender quefoo, en mi opinión.Nitpick en la respuesta de @ bertieb que dice Este ejemplo muestra que tee se está utilizando para evitar una limitación inherente en el comando sudo. sudo no puede canalizar la salida estándar a un archivo.
No existe una limitación inherente, solo un malentendido sobre cómo se procesa el comando.
Ejemplo:
sudo echo 0 > /proc/sys/net/ipv4/ip_forwardEl shell actual analiza la línea de comando. Encuentra la redirección de salida y la realiza. Luego ejecuta el comando, que es el
sudoy proporciona la línea de comando restante como argumentos para el comando ejecutado. Si el shell actual no tiene permisos de root, la redirección de salida fallará.echo 0 | sudo tee /proc/sys/net/ipv4/ip_forwardEsto funciona porque la redirección de salida se difiere al
teecomando, que en ese momento tiene permisos de root porque se ejecutó a través desudo.sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"Esto funciona porque el shell que realiza la redirección tiene permisos de root.
fuente
sudoel comando, pero no para el archivo que sale y la redirección funciona bien:sudo foo-needs-privilege > /tmp/this-output-file-doesntComo otras personas han mencionado, la salida de tubería al
teecomando escribe esa salida tanto en un archivo como en stdout.A menudo lo uso
teecuando quiero capturar la salida de un comando que tarda mucho tiempo en ejecutarse, pero también quiero inspeccionar visualmente la salida a medida que el comando la pone a disposición. De esa manera, no tengo que esperar a que el comando termine de ejecutarse antes de inspeccionar la salida.Lo que no parece haberse mencionado todavía (a menos que me haya perdido) es que el
teecomando también puede escribir en múltiples archivos a la vez. Por ejemplo:escribirá todos los
*.pngarchivos en el directorio actual en dos archivos diferentes (a.txtyb.txt) a la vez.De hecho, puede escribir texto en varios archivos diferentes a la vez de la
teesiguiente manera:fuente
El uso más común de tee es ver el texto en el terminal al mismo tiempo que lo envía al archivo (o archivos). La redacción de su pregunta supone que solo escribe texto en los archivos de registro. Tengo scripts que escriben listas de nombres de archivo o nombres de directorio para activar archivos (para que otros scripts los procesen de forma asincrónica) y uso tee para enviar el mismo contenido a stdout. Todo stdout se dirige a los registros. Así que tengo mi texto donde lo quiero y tengo una entrada de registro que dice que hice esto, todo desde una sola declaración 'echo'
tee también es el mejor método en Unix para hacer múltiples archivos idénticos. Lo uso ocasionalmente para hacer múltiples archivos vacíos, como este ...
fuente
touch? (más inmediatamente obvio lo que está sucediendo)touchno truncará los archivos si ya existen, solo actualizará sus marcas de tiempo y dejará su contenido como está; peroteelos truncará. Además, hacerrm+touches diferente atee(piense en enlaces duros y enlaces simbólicos)truncate -s 0? :-)Imagínese, desea escribir la salida de un comando en un archivo de registro E imprimir en stdout. Cuando necesitas hacerlo al mismo tiempo, entonces necesitas
tee.Un caso de uso es tener scripts de compilación que escriban la compilación completa en stdout (por ejemplo, para Jenkins) pero cosas importantes al mismo tiempo en un archivo de registro separado (para correos electrónicos de resumen).
Realmente comenzarás a faltar
teecuando tengas que hacer un script en Windows. No hayteey eso es realmente molesto.fuente
tee. Cmd nunca fue pensado para secuencias de comandos serias, para eso estaba VBS. Powershell es la nueva herramienta de secuencias de comandos. Por supuesto, Cmd sigue siendo bastante poderoso, pero las herramientas de línea de comandos son bastante pocas.