web-dev-qa-db-ja.com

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

スクリプトの最後に次のようにメールを送信します。

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

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

9
sammy

最も簡単な方法は、おそらくstderrとstdoutへのメッセージをteeすることです。

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

teeは、入力をstdoutを含む複数の宛先に複製します。デフォルトでは、stderrとstdoutの両方が画面に表示されます。 stdoutをMailにリダイレクトし、stderrだけを画面に表示します。

何らかの理由でstdoutで必要な場合は、サブシェル(または他のいくつかの方法)を使用してリダイレクトすることができます。

(
    echo "Script finished on date" | tee /dev/stderr \
        | /usr/bin/Mail -s "Script complete" "[email protected]"
) 2>&1
18
derobert