私は次のことをしたいと思います。
- stdout のコピーをログファイルにリダイレクトし、stdout を画面に表示します。
- stderr を同じログファイルにリダイレクトし、画面に表示しません。
画面への stdout のないコード:
#!/bin/bash
exec 1> >(sed -u 's/^/INF: /' >> common.log)
exec 2> >(sed -u 's/^/ERR: /' >> common.log)
echo "some txt"
echo "an error" >&2
echo "some more txt"
echo "one more error" >&2
ログ:
INF: some txt
INF: some more txt
ERR: an error
ERR: one more error
最初の問題はバッファリングであり、バッファリングされていない場合は sed '-u' で無効にしようとしました。
画面への stdout を使用したコード:
#!/bin/bash
exec 1> >(sed -u 's/^/INF: /' | tee -a common.log)
exec 2> >(sed -u 's/^/ERR: /' >> common.log)
echo "some txt"
echo "an error" >&2
echo "some more txt"
echo "one more error" >&2
その結果、画面がハングし (Ctrl-C を使用する必要がありました)、ログがまだバッファリングされます。提案?