2010-03-13 11 views
6

Tengo ciertos scripts bash críticos que son invocados por código que no controlo, y donde no puedo ver la salida de la consola. Quiero un rastro completo de lo que estos scripts hicieron para el análisis posterior. Para hacer esto, quiero hacer que cada script se trace automáticamente. Esto es lo que estoy haciendo actualmente:¿Mejor forma de hacer un autoarchivo de script bash?

#!/bin/bash 
# if last arg is not '_worker_', relaunch with stdout and stderr 
# redirected to my log file... 
if [[ "$BASH_ARGV" != "_worker_" ]]; then 
    $0 "[email protected]" _worker_ >>/some_log_file 2>&1 # add tee if console output wanted 
    exit $? 
fi 
# rest of script follows... 

¿Existe una forma mejor y más limpia de hacerlo?

Respuesta

12
#!/bin/bash 
exec >>log_file 2>&1 

echo Hello world 
date 

exec tiene un comportamiento con respecto a la magia redirecciones: “Si no se especifica comando, cualquier redirección tengan efecto en el shell actual y el estado de retorno es 0. Si hay un error de redirección, el estado de retorno es 1. "

Además, con respecto a su solución original, exec "$0" es mejor que "$0"; exit $?, porque el primero no deja un proceso de shell adicional hasta que finaliza el subproceso.

+0

¡Más excelente! Solo sabía que tenía que haber una manera más elegante. Gracias, Kevin; esto entrará en uso inmediato ... –

+1

¿puede también salir a la terminal actual y registrarse en un archivo? Traté de usar 'tee' con' exec' pero no encontré ninguna manera .. –

+1

Me gustaría vincular a [esta pregunta] (http://stackoverflow.com/questions/3173131/redirect-copy-of-stdout-to -log-file-from-within-bash-script-itself) donde es posible ver el resultado y también registrarlo, todo ordenado desde el script. –

2

Quizás usted está buscando set -x?

+0

@aaa: Sí, conozco "set -x" - esa es una de las cosas que uso ocasionalmente en la sección "# resto del script sigue ..." más arriba. Debería haberlo mencionado; gracias por hacerlo –

Cuestiones relacionadas