¿Hay algún significado para usar tee?

47

¿Por qué es que casi todas las instrucciones relacionadas con la adición de texto a los archivos del sistema tienen gusto fstabe /etc/apt/sources.list.d/<name>.listimplican el uso tee y la adición de echodicho texto?

Tome los siguientes ejemplos, que se ejecutan como root :

## 1
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee -a file1
## 2
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' >> file2

Correr diff -u file1 file2no devuelve nada; correr md5sum file1 file2muestra que sus sumas de verificación son idénticas, lo que me lleva de vuelta a mi pregunta original:

¿Por qué es | tee <FILENAME>tan frecuente en los documentos de Ubuntu, es solo una buena práctica, de lo contrario, no sería más fácil usar el ejemplo 2 en lugar de pasar la salida de echoa tee?

Alexej Magura
fuente
1
Te falta sudo en tus comandos; eso mostrará resultados diferentes entre los 2;)
Rinzwind
1
@Rinzwind Estoy ejecutando estos comandos como root.
Alexej Magura

Respuestas:

84

Hay una diferencia: tee duplica la salida: la envía tanto al archivo como a la pantalla.

Pero hay más:

  • Por ejemplo, si desea escribir alguna cadena en dos archivos a la vez, el comando con tee que puede usar es:

     echo "some text" | tee file1 > file2  
    
  • Otra cosa que te puede ayudar es evitar un problema al usar sudo. El operador de redirección de salida normal siempre se ejecuta con sus privilegios de usuario, también cuando escribe un sudo delante del comando que genera el texto STDOUT. En otras palabras, esto fallará si no tiene el permiso para escribir en ese archivo:

     sudo echo "something" > bar  
    

    Pero con tee, todo irá bien:

    echo "something" | sudo tee bar  
    

2 ejemplos de este sitio . Tiene un poco más.

Rinzwind
fuente
Puedes sudosin tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Wilf
77
@wilf sí, pero cuando necesitas generar presupuestos ", las cosas se vuelven desordenadas
Braiam
3
En el primer caso, si desea escribir en N archivos, preferiría echo "some text" | tee file1 file2 ... fileNy tal vez agregue > /dev/null, si no desea desorden en stdout.
Elmar Zander
Nice one @ElmarZander :)
Rinzwind
13

teetoma la secuencia de entrada estándar y la escribe tanto en la secuencia de salida estándar como en una secuencia de archivos. Si ayuda a la gente a recordar, el nombre del comando proviene de un divisor en T en la tubería. Hay un buen artículo de Wikipedia donde aprendí sobre el origen del nombre del comando.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

usuario391339
fuente
11

En primer lugar, en teesí mismo no agrega texto, ni tampoco >.

Es tee -ay su complemento, >>que APENDE el texto.

No creo que todos los shells admitan la >>función, por eso teese usa más comúnmente. (Piense en simplemente viejo sh). Tee es un comando, mientras que >>es un operador.

Si usa (mi favorito personal) bash, >y >>es mucho más agradable / fácil.

El uso teetambién le permite sudo SOLO ese comando para que no tenga que sudo la declaración completa, como en sudo sh -c "echo foo > bar". teeTambién le permite dividir la salida. Por supuesto, todo esto se puede ver en man tee. Es principalmente solo su preferencia personal.

Para leer más, ver aquí y aquí .

Kaz Wolfe
fuente
55
Aclaración sobre "sudo JUST that command", para cualquiera que encuentre esto un poco complejo: usar un formulario como sudo somecommand >> filease ejecutará sudo somecommandy luego, como el usuario que invoca , agregar la salida a filea. Usar sudo sh -c "somecommand >> filea"obras, pero puede causar pesadillas entre comillas anidadas. El uso se somecommand | sudo tee -a fileaejecuta somecommandcomo el usuario que invoca, y luego agrega la salida fileacomo root, que generalmente es lo que el usuario quería.
Darael
@Darael Edité la publicación. Gracias por hacer la aclaración.
Kaz Wolfe