scripts script resueltos programas programacion paso pasar parametros manejo hacer ejercicios ejemplos como cadenas shell

resueltos - ¿Cómo redirecciono el resultado de un script de shell completo dentro del script?



scripts bash ejemplos (5)

¿Es posible redirigir todo el resultado de un script de shell de Bourne a alguna parte, pero con comandos de shell dentro del mismo script?

Redirigir la salida de un solo comando es fácil, pero quiero algo más como esto:

#!/bin/sh if [ ! -t 0 ]; then # redirect all of my output to a file here fi # rest of script...

Significado: si el script se ejecuta de forma no interactiva (por ejemplo, cron), guarde el resultado de todo en un archivo. Si se ejecuta interactivamente desde un shell, deje que la salida pase a stdout como de costumbre.

Quiero hacer esto para un script normalmente ejecutado por la utilidad periódica de FreeBSD. Es parte de la ejecución diaria, que normalmente no me interesa ver todos los días en el correo electrónico, por lo que no la envío. Sin embargo, si algo dentro de este script en particular falla, eso es importante para mí y me gustaría poder capturar y enviar por correo electrónico el resultado de esta parte de los trabajos diarios.

Actualización: la respuesta de Joshua es inmediata, pero también quería guardar y restaurar stdout y stderr en todo el script, que se hace así:

# save stdout and stderr to file descriptors 3 and 4, then redirect them to "foo" exec 3>&1 4>&2 >foo 2>&1 # ... # restore stdout and stderr exec 1>&3 2>&4


Dirigiendo la pregunta como actualizada.

#...part of script without redirection... { #...part of script with redirection... } > file1 2>file2 # ...and others as appropriate... #...residue of script without redirection...

Las llaves ''{...}'' proporcionan una unidad de redirección de E / S. Las llaves deben aparecer donde podría aparecer un comando, de manera simplista, al comienzo de una línea o después de un punto y coma. ( Sí, eso se puede hacer más preciso, si quieres objetar, házmelo saber ) .

Tiene razón en que puede conservar el stdout y el stderr originales con las redirecciones que mostró, pero generalmente es más sencillo para las personas que tienen que mantener el script más adelante para comprender lo que sucede si se ajusta el código redirigido como se muestra arriba.


Enviar stdout a un archivo

exec > file

con stderr

exec > file exec 2>&1

anexar stdout y stderr al archivo

exec >> file exec 2>&1


Para guardar la stdout y la stderr originales, puede usar:

exec [fd number]<&1 exec [fd number]<&2

Por ejemplo, el siguiente código imprimirá "walla1" y "walla2" en el archivo de registro ( a.txt ), "walla3" en stdout, "walla4" en stderr.

#!/bin/bash exec 5<&1 exec 6<&2 exec 1> ~/a.txt 2>&1 echo "walla1" echo "walla2" >&2 echo "walla3" >&5 echo "walla4" >&6


Puede hacer que todo el script funcione de la siguiente manera:

main_function() { do_things_here }

Luego, al final del script, ten esto:

if [ -z $TERM ]; then # if not run via terminal, log everything into a log file main_function 2>&1 >> /var/log/my_uber_script.log else # run via terminal, only output to screen main_function fi

Alternativamente, puede registrar todo en el archivo de registro de cada ejecución y aún así enviarlo a stdout simplemente haciendo:

# log everything, but also output to stdout main_function 2>&1 | tee -a /var/log/my_uber_script.log


[ -t <&0 ] || exec >> test.log