2011-11-14 15 views
10

Me preguntaba cómo redirigir stderr a múltiples salidas. Lo intenté con este script, pero no pude hacerlo funcionar bien. El primer archivo debe tener stdout y stderr, y el segundo solo debe tener errores.Redireccionando stdout/stderr a varios archivos

perl script.pl &> errorTestnormal.out &2> errorTest.out 

¿Hay una mejor manera de hacerlo? Cualquier ayuda sería muy apreciada. Gracias.

+0

Desplácese sobre las etiquetas que ha agregado, los seguidores de stdout/stderr = 7 en total. Obtendrás más ojos en tu problema si incluyes una etiqueta para el caparazón que estás utilizando, bash, ¿supongo? Buena suerte. – shellter

Respuesta

16

perl script.pl 2>&1 >errorTestnormal.out | tee -a errorTestnormal.out > errorTest.out

hará lo que usted desea.

Esto es un poco complicado, vamos a ir paso a paso.

  • Nos dicen lo que solía ir a STDERR ahora irá STDOUT
  • Decimos lo que solía ir a STDOUT ahora irá a errorTestnormal.out.

Así que ahora, STDOUT se imprime en un archivo, y STDERR que se imprime a STDOUT. Queremos poner STDERR en 2 archivos diferentes, lo que podemos hacer con tee. T agrega el texto que se le da a un archivo, y también hace eco al STDOUT.

  • Utilizamos tee para anexar a errorTestnormal.out, por lo que ahora contiene toda la STDOUT y STDERR salida del script.pl.
  • A continuación, se escribe STDOUT de tee (que contiene STDERR de script.pl) en errorTest.out

Después de esto, errorTestnormal.out tiene toda la salida STDOUT, y luego toda la salida STDERR. errotTest.out contiene solo la salida STDERR.

+1

Eres un erudito y un caballero. Fantástica respuesta, y muchas gracias :) – kevin948

+2

No es necesario usar fd 3. Simplemente puede hacer: perl script.pl 2> & 1> errorTestnormal.out | tee ... La primera redirección asocia fd 2 (stderr) con el conducto, y el segundo redirecciona stdout al archivo. Si lo hace: perl script.pl> errorTestnormal.out 2> & 1, entonces stderr y stdout van al archivo. –

+0

Buena captura, arreglado eso. – Jarek

0

Supongo que en el caso de la segunda ">" intenta enviar la salida de error de errorTestnormal.out (y no la de script.pl) a errorTest.out.

2

Tuve que perder el tiempo con esto por un tiempo también. Con el fin de obtener stderr en ambos archivos, mientras solo pone stdout en un solo archivo (por ejemplo, stderr en errors.log y output.log y luego stdout en output.log) Y en el orden en que ocurren, este comando es mejor:

((sh test.sh 2>&1 1>&3 | tee errors.log) 3>&1 | tee output.log) > /dev/null 2>&1 

la última/dev/nul 2> & 1 puede omitirse si desea que el stdout y stderr a seguir siendo la salida en la pantalla.