すべての出力をログに送信しようとしていますが、stderrもコンソールに表示されます。
..ログエントリを順番に記録し、いくつかの方法を使用してログ+コンソールにコメントを送信します(stderrと同じ)。
exec &> log
たとえば、次は機能しません。
#!/bin/bash
exec 2> >(tee log) 2>&1 > build.log
echo "Yes 1"
ugh "No 1"
echo "Yes 2"
ugh "No 2"
echo "Message to user" 3>&1
こことは別の場所で見つかった例は、ミックスまたはログとコンソールにリダイレクトされます。
これらの例のどれも、すべての出力をログに送信するわけではありません。 stderrと「特殊メッセージ」も画面に表示されます。
解決策
Chrisは以下の回答でこの問題を解決します。適切な解決策は次のとおりです。
#!/bin/bash
exec 3> >(tee -a log)
exec 4>>log
exec >&4 2>&3
# Out: To log.
echo "I'm standard output."
# Error: To log and console.
ugh "command not found"
# Message: To log and console.
echo "Message to user." >&3
与えられた説明で提案されているようにログ/コンソールに書き込まれます。
答え1
これはスクリプトで行われたと思いますか?もしそうなら、これはあなたの要件を満たす必要があると思います。stdout
にのみ送信されますout.txt
。stderr
コンソールに送信されます。err.txt
#!/bin/bash
exec 3> >(tee ./err.txt)
exec 4>./out.txt
exec >&4 2>&3
echo "I'm normal text!" # only in out.txt
echo "I'm an error!" >&2 # in err.txt and on console
編集する:私はこの小さなスクリプトにとても満足していましたが、その理由はわかりません。
編集2:同じファイルに2つのストリームを書き込むには、両方の場所で同じファイル名を使用します。理論的には、これはstdoutとstderrの間の順序損失をほとんど引き起こさない。実際には十分に近いです。 (詳細については、下の私の冗談を見てください。)