Est-il possible de rediriger toute la sortie d'un shell Bourne script 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 semblable à 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), enregistre la sortie de tout dans un fichier. S'il est exécuté de manière interactive depuis un shell, laissez la sortie aller vers stdout comme d'habitude.
Je veux faire cela pour un script normalement exécuté par l'utilitaire périodique de FreeBSD. Il fait partie de l'exécution quotidienne, que je n'ai pas l'habitude de voir tous les jours dans un courrier électronique, 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 travaux quotidiens.
Mise à jour : La réponse de Joshua est exacte, mais je voulais également sauvegarder 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
2 votes
Tester pour $TERM n'est pas la meilleure façon de tester le mode interactif. A la place, testez si stdin est un tty (test -t 0).
2 votes
En d'autres termes : if [ ! -t 0 ] ; then exec >somefile 2>&1 ; fi
1 votes
Voir ici pour toutes les bonnes choses : http://tldp.org/LDP/abs/html/io-redirection.html En gros, ce qui a été dit par Joshua. exec > file redirige stdout vers un fichier spécifique, exec < file remplace stdin par file, etc. C'est la même chose que d'habitude mais en utilisant exec (voir man exec pour plus de détails).
2 votes
Dans votre section de mise à jour, vous devriez également fermer les FD 3 et 4, comme ceci :
exec 1>&3 2>&4 3>&- 4>&-
0 votes
Permission denied
sur le premierexec
ligne.