如何将输出发送到屏幕和邮件?


9

我使用以下命令在脚本末尾发送电子邮件。

echo "Script finished on `date`" | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com".

但是,我也想在屏幕上回显相同的消息。我要如何在同一条语句中做到这一点?

Answers:


19

最简单的方法可能是tee将消息发送到stderr以及stdout:

echo "Script finished on date" | tee /dev/stderr \
    | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com"

tee将其输入复制到多个目的地,包括stdout。默认情况下,stderr和stdout都显示在屏幕上。您要将stdout重定向到Mail,仅将stderr转到屏幕。

如果出于某种原因需要在stdout中使用它,则可以使用子外壳(或其他几种方法)将其重定向回:

(
    echo "Script finished on date" | tee /dev/stderr \
        | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com"
) 2>&1

3
或者,发送到文件,然后邮寄文件...如果输出很大并且您想发送它(例如,以base64编码的gzip MIME附件形式发送),则非常有用。或者只是将所有输出重定向到文件(例如,使用exec &> $LOGFILE),然后还原stdout,将文件分类为stdout并将其邮寄。
cas 2012年

谢谢克雷格。由于在这种情况下我的文字很小,因此我将接受derobert的答复。
萨米2012年

嗯..这确实有效,但是我意识到我需要在问题描述中添加更多内容。我将此解决方案用作脚本的最后一行。我在脚本上使用了“ nohup”命令,将脚本的所有输出收集为“ nohup.out”,而我所看到的只是这一行“脚本在xxxxx上完成”。在使用此解决方案之前,我将所有脚本输出都很好。有没有办法我可以追加最后一行的输出而不是全部删除?
萨米2012年

1
使用“ tee -a”解决了这个问题。
sammy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.