Cómo redirigir la salida a múltiples archivos de registro

52

¿Cómo redirigir la salida estándar a múltiples archivos de registro? Lo siguiente no funciona:

some_command 1> output_log_1 output_log_2 2>&1
De dos pisos
fuente
66
Con zsh, puedes usar some_command >output_log_1 >output_log_2.
jofel

Respuestas:

70

Ver man tee:

NOMBRE: tee - lee desde la entrada estándar y escribe en la salida y archivos estándar

SINOPSIS: tee [OPCIÓN] ... [ARCHIVO] ...

En consecuencia:

echo test | tee file1 file2 file3
akond
fuente
¿Se puede redirigir el stderr en más de un archivo?
fromnaboo
Sí, se puede hacer en virtud de la redirección: find / -name test 2> & 1 | tee
file1 file2 file3
@akond, cmd 2>&1 | tee log1 log2 intenté ejecutar como arriba, pero necesito presionar ctrl-c para redirigirlo al segundo archivo de registro. También la salida está impresa en la consola. Quiero que la salida del comando se redirija a los registros pero no en la consola. Cualquier ayuda es apreciada.
doubledecker
@doubledecker El teecomando escribe stdinen los archivos y también en stdout. Si no desea que la salida aparezca en el terminal, debe redirigirla /dev/nullcomo lo haría normalmente.
Minix
44
También es posible agregar archivos múltiples:echo test | tee --append file1 file2
user1364368
13

Digamos que su salida se genera a partir de una función cmd():

cmd() {
    echo hello world!
}

Para redirigir la salida cmda dos archivos, pero no a la consola, puede usar:

cmd | tee file1 file2 >/dev/null

Esto funcionará para múltiples archivos, dada cualquier tubería de fuente de datos para tee:

echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null

Esto también funcionará:

echo $(cmd) | tee file1 file2 >/dev/null

Sin la /dev/nullredirección, tee enviará salida a stdout además de los archivos especificados.

Por ejemplo, si esto se ejecuta desde la consola, verá la salida allí. Ejecutado desde un crontab, la salida mostrará el mensaje de estado que se le envió por correo (también vea la respuesta de Gilles aquí https://unix.stackexchange.com/a/100833/3998 ).

Esto funcionó para mí en bash en Ubuntu 12.04, y se ha verificado en Ubuntu 14.04 usando GNU bash 4.3.11 (1), por lo que debería funcionar en cualquier versión reciente de GNU bash.

KP MacGregor
fuente
@doubledecker: parece que satisface sus condiciones, por lo que puede aceptarse como respuesta. Además, +1 como lo he probado en GNU bash ( version 4.3.11(1)-release (i686-pc-linux-gnu)) en Ubuntu 14.04.
belacqua
9

Es una publicación antigua pero la encontré ahora ...

En lugar de redirigir el resultado > /dev/null, puede redirigirlo al último archivo:

echo "foobarbaz" | tee file1 > file2

O para agregar el resultado:

echo "foobarbaz" | tee -a file1 >> file2
James Cook
fuente
esto es más o menos lo que dijo otra respuesta (excepto -a en tee)
Archemar
Este es el camino a seguir.
71GA
5

Como @jofel mencionó en un comentario debajo de la respuesta, esto se puede hacer de forma nativa en zsh:

echo foobar >file1 >file2 >file3

o, con expansión de llaves:

echo foobar >file{1..3}

Internamente, esto funciona de manera muy similar a las teerespuestas proporcionadas anteriormente. El shell conecta la salida estándar del comando a un proceso que canaliza a múltiples archivos; por lo tanto, no hay ninguna ventaja técnica de peso para hacerlo de esta manera (pero no parece real bueno). Vea el zshmanual para más.

Strugee
fuente
2

No se puede comentar, sin embargo, otra forma de expresar

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

Podría simplificarse a esto, cuando se trata de muchos archivos.

echo "foobarbaz" | tee file{1..8} > /dev/null
usuario149146
fuente
2
¿Cómo es esto realmente diferente de las otras respuestas ya dadas? Sobre todo porque algunas personas quieren probable literal file1a través file8como sus nombres y los que son propensos a solo ejemplo marcadores de posición para los nombres de los archivos
Eric Renouf
1
Probablemente o no, esta es exactamente la solución que necesitaba, y pensé que podría ayudar a alguien más.
user149146
-2

Necesitaba un archivo de registro de sesión y otro archivo para todas las sesiones que hice:

echo blabla |tee thisession >>allsessions

Gediz GÜRSU
fuente
El teecomando ya ha sido mencionado.
RalfFriedl