¿Cómo funciona el comando tee?

¿Cómo funciona el comando tee?

Después de encontrarme con unas 3 teeexplicaciones que considero poco didácticas, pediría una explicación simple, general y escalonada (si es posible) sobre este comando, dirigida a los recién llegados a Linux.

Entiendo que lo usamos a través de una tubería, en la salida estándar de un comando o, alternativamente, directamente en un archivo determinado, pero creo que extraño lo que realmente hace el comando con este contenido y cuándo es útil.

Así que esto es lo que pregunto, con la esperanza de encontrar una explicación didáctica, que sirva a los recién llegados de una manera clara y escalonada:

  1. ¿Cómo funciona el comando con la salida estándar de un comando o, alternativamente, con los archivos mismos?

  2. ¿Por qué es común decir que teelee la entrada estándar? Quiero decir, si lo hago ls -l, teeno lee la sintaxis ls -len sí, sino la salida estándar que imprimió en la sesión.

Además, si quieres, comparte un ejemplo práctico de tu trabajo diario sobre ¿cuándo teete resulta muy útil?

Respuesta1

Del teemanual de mi sistema:

La utilidad tee copia la entrada estándar en la salida estándar, haciendo una copia en cero o más archivos. La salida no tiene búfer.

Por lo tanto, lee la entrada estándar y la copia en la salida estándar y, al hacerlo, también duplica la secuencia en uno o varios archivos.

En el siguiente proceso, teetomaría el resultado del primer comando en el proceso y lo copiaría a la salida estándar (el terminal) al mismo tiempo que haría copias del mismo en los archivos one, twoy three:

$ somecommand | tee one two three

teetiene muchos usos, uno es junto con sudoredirigir la salida a un archivo propiedad de root:

$ somecommand | sudo tee /root/somefile >/dev/null

Lo siguiente seríanohan funcionado ya que la redirección ocurre como usuario sin privilegios (también se ejecutaría somecommandcomo root, lo cual puede no ser deseado):

$ sudo somecommand >/root/somefile

Un ejemplo artificial de agregar un conjunto fijo de líneas a muchos archivos a la vez (a todos ~/.profilelos archivos de los usuarios, suponiendo que *se expanda a los nombres de usuario y que la línea de comando expandida no sea demasiado larga para que la maneje el shell):

$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH

Un ejemplo real de uso tee:

time doas box-build.sh 2>&1 | tee build.out |  grep '^=*>'

Este soy yo construyendo el sistema base OpenBSD. doasesel "equivalente" de OpenBSD desudoy box-build.shes un pequeño script de shell que realiza la construcción (esencialmente cd /usr/src && make obj && make build). Me gustaría almacenar el resultado de todo el proceso de compilación, incluidos los errores o advertencias, pero no quiero que todo se derrame en mi terminal. Con este fin, suelo teeguardar todo build.outy luego grepsolo obtener una pista de en qué parte del proceso nos encontramos en la terminal.

Vea también las otras preguntas aquí que están etiquetadas con eletiqueta.

información relacionada