画面とメールの両方に出力を送信する方法は?


9

スクリプトの最後にメールを送信するには、以下を使用します。

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

ただし、同じメッセージを画面にもエコーしたい。同じことをどのように行うのですか?

回答:


19

最も簡単な方法はおそらくteestderrと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)、標準出力を復元し、ファイルを標準出力にキャットしてメールで送信します。
cas

クレイグありがとう。この場合のテキストは非常に小さいため、derobertからの応答を使用します。
サミー2012

うーん..これはうまくいきましたが、問題の説明にさらに追加する必要があることに気付きました。このソリューションをスクリプトの最終行として使用しました。スクリプトで "nohup"コマンドを使用して、スクリプトのすべての出力を "nohup.out"として収集しました。表示されるのは、この1行の "Script finished on xxxxx"だけです。このソリューションを使用する前に、すべてのスクリプト出力を問題なく取得しました。すべてを消去する代わりに、この最後の1行の出力を追加する方法はありますか?
サミー2012

1
「tee -a」を使用して問題を解決しました。
サミー2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.