È possibile reindirizzare tutto l'output di uno script della shell Bourne da qualche parte, ma con comandi shell all'interno dello script stesso?
Reindirizzare l'output di un singolo comando è semplice, ma voglio qualcosa di più simile a questo:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
Significato: se lo script viene eseguito in modo non interattivo (ad esempio cron), salva l'output di tutto in un file. Se eseguito in modo interattivo da una shell, lasciare l'output su stdout come al solito.
Voglio farlo per uno script normalmente eseguito dall'utilità periodica di FreeBSD. Fa parte della corsa quotidiana, che normalmente non mi interessa vedere ogni giorno via e-mail, quindi non l'ho inviato. Tuttavia, se qualcosa all'interno di questo particolare script fallisce, questo è importante per me e mi piacerebbe essere in grado di catturare e inviare via e-mail l'output di questa parte dei lavori quotidiani.
Aggiornamento: la risposta di Joshua è precisa, ma volevo anche salvare e ripristinare stdout e stderr nell'intero script, che è fatto in questo modo:
# 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>&-