É possível redirecionar toda a saída de um script de shell Bourne para algum lugar, mas com comandos de shell dentro do próprio script?
Redirecionar a saída de um único comando é fácil, mas quero algo mais como este:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
Significado: se o script for executado de maneira não interativa (por exemplo, cron), salve a saída de tudo em um arquivo. Se executado interativamente a partir de um shell, deixe a saída ir para stdout, como de costume.
Eu quero fazer isso para um script normalmente executado pelo utilitário periódico FreeBSD. Faz parte da execução diária, que normalmente não me importo de ver todos os dias no email, por isso não o envio. No entanto, se algo dentro desse script em particular falhar, isso é importante para mim e eu gostaria de poder capturar e enviar por e-mail a saída dessa parte dos trabalhos diários.
Atualização: A resposta de Joshua é direta, mas eu também queria salvar e restaurar stdout e stderr em todo o script, o que é feito assim:
# 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>&-