¿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
¿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
Respuestas:
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
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.
tee
comando escribe stdin
en los archivos y también en stdout
. Si no desea que la salida aparezca en el terminal, debe redirigirla /dev/null
como lo haría normalmente.
echo test | tee --append file1 file2
Digamos que su salida se genera a partir de una función cmd()
:
cmd() {
echo hello world!
}
Para redirigir la salida cmd
a 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/null
redirecció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.
version 4.3.11(1)-release (i686-pc-linux-gnu)
) en Ubuntu 14.04.
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
-a
en tee)
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 tee
respuestas 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 zsh
manual para más.
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
file1
a través file8
como sus nombres y los que son propensos a solo ejemplo marcadores de posición para los nombres de los archivos
Necesitaba un archivo de registro de sesión y otro archivo para todas las sesiones que hice:
echo blabla |tee thisession >>allsessions
tee
comando ya ha sido mencionado.
zsh
, puedes usarsome_command >output_log_1 >output_log_2
.