ログの場合はstdout、ログ、コンソールの場合はstderr

ログの場合はstdout、ログ、コンソールの場合はstderr

すべての出力をログに送信しようとしていますが、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.txtstderrコンソールに送信されます。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の間の順序損失をほとんど引き起こさない。実際には十分に近いです。 (詳細については、下の私の冗談を見てください。)

おすすめ記事