Comment envoyer la sortie à l'écran et au courrier?

9

J'utilise ce qui suit pour envoyer un e-mail à la fin d'un script.

echo "Script finished on `date`" | /usr/bin/Mail -s "Script complete" "[email protected]".

Cependant, je veux également faire écho du même message à l'écran. Comment dois-je procéder dans la même déclaration?

sammy
la source

Réponses:

19

Le moyen le plus simple est probablement teed'envoyer le message à stderr ainsi qu'à stdout:

echo "Script finished on date" | tee /dev/stderr \
    | /usr/bin/Mail -s "Script complete" "[email protected]"

teeduplique son entrée vers plusieurs destinations, y compris stdout. Par défaut, stderr et stdout vont à l'écran; vous redirigez stdout vers Mail, laissant simplement stderr aller à l'écran.

Si vous en avez besoin dans stdout pour une raison quelconque, vous pouvez le rediriger en utilisant un sous-shell (ou plusieurs autres façons):

(
    echo "Script finished on date" | tee /dev/stderr \
        | /usr/bin/Mail -s "Script complete" "[email protected]"
) 2>&1
derobert
la source
3
Alternativement, té vers un fichier, puis envoyez le fichier ... très utile si la sortie est énorme et que vous souhaitez l'envoyer, par exemple, sous forme de pièce jointe MIME gzippée en base64. ou redirigez simplement toutes les sorties vers un fichier (par exemple avec exec &> $LOGFILE), puis restaurez stdout, transférez le fichier vers stdout et envoyez-le par courrier.
cas
Merci Craig. Étant donné que mon texte dans ce cas est très petit, je vais suivre la réponse de derobert.
sammy
Hmm .. cela a fonctionné mais j'ai réalisé que je devais ajouter plus à la description de mon problème. J'ai utilisé cette solution comme dernière ligne de mon script. J'ai utilisé une commande "nohup" sur mon script pour collecter toutes les sorties de mon script en tant que "nohup.out" et tout ce que je vois est juste cette ligne "Script terminé sur xxxxx". Avant d'utiliser cette solution, j'ai bien obtenu toutes les sorties de script. Existe-t-il un moyen d'ajouter la sortie de cette dernière ligne au lieu de tout effacer?
sammy
1
L'utilisation de "tee -a" a résolu le problème.
sammy