Todos los usos tee
que vi en mi vida fueron tales:
do_something | tee -a logfile
O:
do_something_else | tee logfile
¿Está tee
inventado 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
?
tee
y 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.>
>>
tee
tee
tee
Respuestas:
Lo que no se ve es que
do_something | tee -a logfile
pone en la salidalogfile
y la salida estándar, mientrasdo_something >> logfile
pone solamente en el archivo de registro.El propósito de
tee
es producir un escenario de entrada múltiple y salida única, al igual que en un cruce 'T'.EDITAR
Ha habido comentarios sobre cómo
tee
permite un uso más descuidado desudo
. Esto viene al caso:cat
,dd
o tal vez mejorbuffer
proporcionar esta posibilidad con un mejor rendimiento, si no necesita las múltiples salidas. Úselotee
para lo que está diseñado, no para lo que "también puede hacer"fuente
tee
incluso puede tomar múltiples argumentos y escribir en muchos archivos a la vez.cat
de una manera directa en lugar de,tee
por ejemplo, enecho /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern
?echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_pattern
no 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_pattern
funciona, pero add
menudo 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) ...cat
ni el/bin/cat
trabajo para mí en esta situación. No importa de dóndecat
provenga: el>
shell de nivel superior (no sudo) seguirá manejándolo. La ventaja detee
máscat
en 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).dd
es sin duda una opción viable, aunque todavía estaría a favortee
de estocat
ytee
como incorporado? ¿Y qué versión desudo
puede ejecutar Shell Builtins?Tee
no 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_something
y lo agrega al archivo de registro, mientras que también lo muestra al usuario. De hecho, la página de Wikipediatee
tiene 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 )
Tee
trabaja con la filosofía de Unix:(Crédito a lo básico de la filosofía de Unix )
tee
se adapta a todos estos:fuente
sudo tee -a
es 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 unsudo
sistema basado (cómo Ubuntu está configurado de forma predeterminada) en lugar de usarlosu
con un contraseña de root). Creo quetee
es anteriorsudo
, por lo que no es una razón paratee
existir. No es necesariotee
para eso, simplemente es más corto para escribir de forma interactiva quesudo sh -c 'cat > output'
.tee
alimentar dos tuberías, comofoo | tee >(pipe2) | pipe1
. Otra forma divertida esffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.log
ver 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/tty
en 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 -a
En mi humilde opinión es un abuso de tee. Usesudo cat
,sudo dd
o (con el mejor rendimiento en muchos casos)sudo buffer
si 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
hi
en el terminal (stdout
) y el archivo nombrado, como se muestra a continuación:tee
le 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í
echo
se ejecuta como el usuario, mientrastee
escribe en el archivo comoroot
):Con
tee
, puede escribir en muchos archivos ( ystdout
):También es posible utilizar
exec
contee
grabar 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>&1
en un script bash que permite que el script genere stdout y stderr a ambos, stdout y al archivo señalado por$LOGFILE
.2>&1
soltar 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,
tee
es 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
tee
a su pipa (|
) es decir:ls / | tee ls.txt
Compara 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
tee
Está 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$d
que 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
tee
no crea las subcapas; el shell de llamada se ejecutasha5sum
ycat
conecta 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 paratee
leer directamentefile.tar.gz
.cat
es amor.cat
es 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
.cat
es 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_forward
El shell actual analiza la línea de comando. Encuentra la redirección de salida y la realiza. Luego ejecuta el comando, que es el
sudo
y 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_forward
Esto funciona porque la redirección de salida se difiere al
tee
comando, 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
sudo
el comando, pero no para el archivo que sale y la redirección funciona bien:sudo foo-needs-privilege > /tmp/this-output-file-doesnt
Como otras personas han mencionado, la salida de tubería al
tee
comando escribe esa salida tanto en un archivo como en stdout.A menudo lo uso
tee
cuando 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
tee
comando también puede escribir en múltiples archivos a la vez. Por ejemplo:escribirá todos los
*.png
archivos en el directorio actual en dos archivos diferentes (a.txt
yb.txt
) a la vez.De hecho, puede escribir texto en varios archivos diferentes a la vez de la
tee
siguiente 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)touch
no truncará los archivos si ya existen, solo actualizará sus marcas de tiempo y dejará su contenido como está; perotee
los truncará. Además, hacerrm
+touch
es 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
tee
cuando tengas que hacer un script en Windows. No haytee
y 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.