¿Es posible redirigir toda la salida de un script de shell Bourne a algún lugar, pero con comandos de shell dentro del propio 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 la salida de todo en un archivo. Si se ejecuta de forma interactiva desde un shell, deje que la salida vaya 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 gusta ver todos los días en el correo electrónico, por lo que no me la envían. 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 la salida de esta parte de los trabajos diarios.
Actualización: la respuesta de Joshua es acertada, pero también quería guardar y restaurar stdout y stderr en todo el script, lo 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
exec 1>&3 2>&4 3>&- 4>&-