
Después de encontrarme con unas 3 tee
explicaciones 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:
¿Cómo funciona el comando con la salida estándar de un comando o, alternativamente, con los archivos mismos?
¿Por qué es común decir que
tee
lee la entrada estándar? Quiero decir, si lo hagols -l
,tee
no lee la sintaxisls -l
en 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 tee
te resulta muy útil?
Respuesta1
Del tee
manual 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, tee
tomarí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
, two
y three
:
$ somecommand | tee one two three
tee
tiene muchos usos, uno es junto con sudo
redirigir 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 somecommand
como 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 ~/.profile
los 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. doas
esel "equivalente" de OpenBSD desudo
y box-build.sh
es 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 tee
guardar todo build.out
y luego grep
solo 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 elteeetiqueta.