2009-04-18 22 views
12

El manual indica que el tee es una herramienta de "instalación de tuberías". Los casos me [1] confunden:Unix: uso confuso del Tee -command

1. Caja de

echo "foo bar" | sudo tee -a /path/to/some/file 

2. caso

:w !sudo tee % 

Es difícil entender la lógica de la camiseta de los casos. ¿Cómo funciona el tee?

+0

':! W sudo tee'% http://stackoverflow.com/a/7078429/739331 –

Respuesta

7

tee se usa normalmente para dividir la salida de un programa para que pueda mostrarse y guardarse en un archivo. El comando puede usarse para capturar salida intermedia antes de que otros comandos o programas modifiquen los datos. El comando tee lee la entrada estándar y luego escribe su contenido en la salida estándar. Simultáneamente copia el resultado en el archivo (s) especificada o variables de

tee [OPTION]... [FILE]... 

Por ejemplo

tee [ -a ] [ -i ]... [ File ]... 
  • -a añade la salida al final del archivo en lugar de escribir sobre ella.

  • -i Ignora las interrupciones.

enter image description here

Con sudo y anexar al archivo con su ejemplo en la cuestión

ls -l | sudo tee -a file.txt 
+1

Quizás, a continuación, puede mostrar cómo redirige la salida también a 'less' cuando ya usa' sudo'. –

12

tee copias stdin-stdout (como cat) y, además, escribe todo para el archivo llamado. Al usarlo de esta manera con sudo, uno puede enviar información a un modo privilegiado y, al mismo tiempo, monitorear si las cosas correctas fueron allí.

También tenga en cuenta, que debido a la forma en que se maneja la redirección en la cáscara del casi equivalente

sudo echo "foo bar" > /path/to/some/file 

no funcionará, ya que la redirección se llevaría a cabo por el usuario llamante y no por el usuario de destino sudo .

+0

¿Qué sucede si los datos stdout son demasiado grandes? ¿Cómo transfiere los datos al archivo? por tamaño o por período de tiempo? – Shantesh

0

camiseta simplemente refleja el resultado en un archivo que puede ser usado como argumento para el primer golpe.

En el caso de que muestres tee, se llama superusuario (a través de sudo) y su único propósito es escribir un archivo como superusuario en lugar de ser el usuario que hace el eco.

33

tee se utiliza para dividir una canalización de comandos, lo que permite guardar la salida de un comando a un archivo y lo envía a lo largo de la tubería hacia abajo. En el primer ejemplo que diste ::

echo "foo bar" | sudo tee -a /path/to/some/file 

"foo bar", se hizo eco de la salida estándar y anexa a /path/to/some/file. Piense en el tee como una unión en "T" en una tubería, dividiendo la salida en otras dos tuberías.

+4

De ahí viene el nombre :-) – Joey

2

Recuerde que el objetivo de tee no está restringido a archivos normales, sino que puede ser a dispositivos, FIFO, etc. Además, puede conectar a otra invocación tee, y así sucesivamente. :-)

1

Me parece que el comando tee es muy útil en la depuración de scripts de shell que contienen tuberías de gran longitud. Este es el final de un guión fantasmal que está atrasado hace una década para una reescritura en Perl, pero todavía funciona. (Fue modificada en 1998 por última vez, como sucede.)

# If $DEBUG is yes, record the intermediate results. 
if [ "$DEBUG" = yes ] 
then 
    cp $tmp.1 tmp.1 
    cp $tmp.2 tmp.2 
    cp $tmp.3 tmp.3 
    tee4="| tee tmp.4" 
    tee5="| tee tmp.5" 
    tee6="| tee tmp.6" 
    tee7="| tee tmp.7" 
fi 

# The evals are there in case $DEBUG was yes. 
# The hieroglyphs on the shell line pass on any control arguments 
# (like -x) to the sub-shell if they are set for the parent shell. 
for file in $* 
do 
    eval sed -f $tmp.1 $file    $tee4 | 
    eval sed -f $tmp.3      $tee5 | 
    eval sh ${-+"-$-"}      $tee6 | 
    eval sed -f $tmp.2      $tee7 | 
    sed -e '1s/^[ ]*$/[email protected]/' -e '/^[email protected]/d' 
done 

Los tres guiones de sed que se ejecutan son espantosa - No planeo para mostrarlos. Este también es un uso semi-decente de eval. Los nombres de archivos temporales normales ($ tmp.1, etc.) se conservan con un nombre fijo (tmp.1, etc.) y los resultados intermedios se conservan en tmp.4 .. tmp.7. Si estuviera actualizando el comando, usaría '"[email protected]#"' en lugar de '$*' como se muestra. Y, cuando lo estoy depurando, no hay más que un archivo en la lista de argumentos, por lo que el pisoteo de los archivos de depuración no es un problema para mí.

Tenga en cuenta que si necesita hacerlo, puede crear varias copias de la entrada a la vez; no es necesario alimentar un comando tee a otro.

Si alguien lo necesita, tengo una variante de tee llamada tpipe que envía copias de la salida a varias tuberías en lugar de varios archivos. Sigue funcionando incluso si uno de los conductos (o salida estándar) termina antes de tiempo. (Ver mi perfil para información de contacto.)

3

Explicaciones para los casos

1. la escalada de los permisos con la sudo- y -Tee comandos

El ejemplo no se trata simplemente de lógica , más bien convención. It muestra la convención de escalar permisos:

echo "Body of file..." | sudo tee root_owned_file > /dev/null 

Este ejemplo muestra tee se utiliza para de derivación una limitación inherente en el comando sudo. sudo no puede canalizar la salida estándar a un archivo. Por volcando su flujo de stdout en /dev/null, también suprimimos la salida reflejada en la consola.

2. funcionamiento sudo comandos con Vim

ya que se puede utilizar sudo comandos con Vim, puede utilizar el comando si se olvidó de funcionar como un sudo. Es útil en lugares como /etc/init.d/, donde encontrará archivos de solo lectura.

lógica con la T-comando

Es como una sucursal en Git, o mejor, por favor, vea the T analogy by Rick Copeland. Con suerte, el ejemplo modificado (original) ayuda a comprender su uso:

curl "http://en.wikipedia.org/wiki/Pipeline_(Unix)" | tee original_site | sed 's/[^a-zA-Z ]/ /g' | tr 'A-Z ' 'a-z\n' | grep '[a-z]' | sort -u | comm -23 - /usr/share/dict/words 
0

camiseta de comandos simplemente crea N + 1 no de archivos, 1 copia pasó a la salida estándar y otros a los argumentos proporcionados a T (es decir, archivos) donde N : número de agruments pasados ​​a tee