2012-06-27 13 views
27

Tengo un script bash que tiene set -x en él. ¿Es posible redirigir las impresiones de depuración de este script y todo su resultado a un archivo? Idealmente me gustaría hacer algo como esto:redirigir todos los resultados en un script bash cuando se usa set -x

#!/bin/bash 
set -x 
(some magic command here...) > /tmp/mylog 
echo "test" 

y obtener la salida

+ echo test 
test 

en/tmp/mylog, no en la salida estándar.

+1

Ver [esta pregunta] (http://stackoverflow.com/questions/692000/how-do-i-write-stderr-to-a-file-while-using-tee-with-a-pipe). No es un duplicado, pero creo que esto debería responder a su pregunta. – vergenzt

Respuesta

39

Esto es lo que he buscado en Google y recuerdo a mí mismo usando este hace algún tiempo ...

uso ejecutivo tanto para redirigir la salida estándar y el error estándar de todos los comandos en un script:

#!/bin/bash 
logfile=$$.log 
exec > $logfile 2>&1 

para más magia redirección echa un vistazo a Advanced Bash Scripting Guide - I/O Redirection.

Si también desea ver la salida y la depuración en el terminal en además de en el archivo de registro, consulte redirect COPY of stdout to log file from within bash script itself.

Si desea manejar el destino de la salida set -x traza independientemente de lo normal y STDOUTSTDERR, ver bash storing the output of set -x to log file.

+0

Interesante. ¿Cómo podría usar este método para capturar errores (stdout 2) en un archivo de registro Y devolverlos a stdout 2? para que cron pueda enviar correctamente las alertas de error? –

+0

@JoeyT, vea si esto funciona para usted: haga una copia de seguridad de STDOUT antes de configurar el archivo de registro con 'exec 3 <& 1', luego agregue estas dos líneas al final:' exec 1 <& 3 3 <& - 'y' cat $ $ .log' - esto debería restaurar STDOUT y cerrar fd 3 para la limpieza. Basado en la referencia 'tldp' original y este [http://tldp.org/LDP/abs/html/ioredirintro.html](http://tldp.org/LDP/abs/html/ioredirintro.html) – nik

+0

@ JoeyT He editado la respuesta y agregué dos enlaces más útiles; el primero debería ser suficiente para explicar cómo puedes hacer esto. –

11

la salida -x va a stderr, por lo que ingrese lo haga:

set -x 
exec 2>/tmp/mylog 
Cuestiones relacionadas