Me gustaría ejecutar varios comandos y capturar todos los resultados en un archivo de registro. También quiero imprimir cualquier error en la pantalla (u opcionalmente enviar la salida a alguien).Escribir STDOUT & STDERR en un archivo de registro, también escribir STDERR en la pantalla
Aquí hay un ejemplo. El siguiente comando ejecutará tres comandos y escribirá todos los resultados (STDOUT y STDERR) en un solo archivo de registro.
{ command1 && command2 && command3 ; } > logfile.log 2>&1
Esto es lo que quiero hacer con la salida de estos comandos:
- STDERR y stdout para todos los comandos va a un archivo de registro, en caso de que necesite más tarde --- Por lo general ganó mira aquí a menos que haya problemas.
- Imprima STDERR en la pantalla (u opcionalmente, pipe to/bin/mail), para que cualquier error se destaque y no se ignore.
Sería bueno si los códigos de retorno aún pudieran utilizarse, para que yo pudiera hacer algún tipo de manejo de errores. Tal vez quiero enviar correo electrónico si hubo un error, así:
{comando1 & & comando2 & & Command3; }> logfile.log 2> & 1 || mailx -s "Se ha producido un error" [email protected]~~V~~singular~~3rd
El problema me encuentro es que STDERR pierde contexto durante la redirección de E/S. A '2> & 1' convertirá STDERR en STDOUT, y por lo tanto no puedo ver los errores si hago 2> error.log
Aquí hay un par de ejemplos más jugosos. Vamos a pretender que estoy ejecutando algunos comandos de compilación familiares, pero no quiero que toda la construcción se detenga solo por un error, así que utilizo el indicador '--manejar'.
{ ./configure && make --keep-going && make install ; } > build.log 2>&1
O, aquí hay un construir y desplegar script sencillo (y quizás descuidado), que seguir adelante en caso de un error.
{ ./configure && make --keep-going && make install && rsync -av --keep-going /foo devhost:/foo} > build-and-deploy.log 2>&1
Creo que lo que quiero implica algún tipo de Bash I/O Redirection, pero no puedo resolver esto.
Tu código funciona, pero tan pronto como ejecuto varios comandos como '(./doit && ./doit2 >> log) 2> & 1 | tee-a log', luego stdout y stderr para doit y doit2 se imprimen en la pantalla. –
Esto parece funcionar si hago algo como esto: '({./doit && ./stdout.sh;} >> log) 2> & 1 | tee-log' –
@StefanLasiewski - sí, la redirección de archivos solo se aplica al comando inmediatamente anterior. Su solución alternativa para agrupar los dos comandos en una sola subshell es la solución más fácil; otra solución más fea sería redirigir la salida estándar para cada comando '(./doit >> log && ./doit2 >> log) 2> & 1 | tee-log' –