Est-il possible de rediriger toute la sortie d'un script shell Bourne vers quelque part, mais avec des commandes shell à l'intérieur du script lui-même?
Rediriger la sortie d'une seule commande est facile, mais je veux quelque chose de plus comme ceci:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
Signification: si le script est exécuté de manière non interactive (par exemple, cron), enregistrez la sortie de tout dans un fichier. S'il est exécuté de manière interactive à partir d'un shell, laissez la sortie aller à stdout comme d'habitude.
Je veux le faire pour un script normalement exécuté par l'utilitaire périodique FreeBSD. Cela fait partie de la course quotidienne, que je ne tiens normalement pas à voir tous les jours par e-mail, donc je ne l'ai pas envoyé. Cependant, si quelque chose à l'intérieur de ce script particulier échoue, c'est important pour moi et j'aimerais pouvoir capturer et envoyer par courrier électronique la sortie de cette partie des tâches quotidiennes.
Mise à jour: la réponse de Joshua est parfaite, mais je voulais également enregistrer et restaurer stdout et stderr autour de l'ensemble du script, ce qui se fait comme suit:
# 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>&-