標準エラー出力と標準出力の両方をログファイルに書き出し、標準エラー出力を端末(またはデフォルトの出力デバイス)に出力します。
動機: 私は自分のcrontabにコマンドがあります、そして、私はその出力の全てをファイルに記録したいです、そして、エラー出力に書かれた何かがあれば私に電子メールを送りたいです。
私はこれらでいくらか成功しました:
(echo out1; echo err1 1>&2; echo out2; echo err2 1>&2) \
2> >(tee -a log) \
1>>log
または
(echo err1 1>&2; echo out2; echo err2 1>&2) \
3>&1 \
1> >(tee -a log 1>/dev/null) \
2> >(tee -a log 1>&3)
またはexecで:
exec 3>&1
exec 1> >(tee -a log2 1>/dev/null)
exec 2> >(tee -a log2 1>&3)
echo out1; echo err1 1>&2; echo out2; echo err2 1>&2
(3番目の方法でもプロンプトがログに記録されるため、対話型シェルでは機能しません。)
3つの解決策すべての問題は、ログファイルの行が異なる順序で含まれていることです。
out1
out2
err1
err2
これの代わりに:
out1
err1
out2
err2
これを防ぐ方法はありますか?何かのようなもの 2>&1
これは、ディスクリプタではなく、出力自体を複製します。
非常に似ている 質問 Windows用
UとLで複製: unix.stackexchange.com/questions/79996/… 。
—
Tomasz
はい、すみません、それは見つかりませんでした。他の質問は別のドメインにあるため、質問に重複のフラグを立てることはできません。どうすればよいですか。ちなみに、このようなもののためのきれいな解決策がないことは私にとってやや驚くべきことです
—
TPE
あなたはそれを投稿していないので、クロス投稿ではありません。それなら心配はありません。そのままにしてください。問題の問題に関しては、それが見えるかもしれないほど驚くべきことではありません。それは簡単です。 STDERRとSTDOUTは2つの異なるチャネルであり、それらを同期させるとコストがかかります。同期されていない、または共通ログでエラーの兆候がないかどうかを確認する方法を考えることができます
—
Tomasz
grep
または似たようなもの。