2017-07-29 20 views
0

stderrの出力をbashのスクリプト内のファイルにリダイレクトしようとしていますが、書き込まれた各エラー出力に対して現在のスクリプト名とタイムスタンプ。これは私がそれをやっている方法です。スクリプト内のstderrをリダイレクトしてプレフィックスを追加する

exec 2> >(sed "s/^/\n$(date +'%Y%m%d%H%M%S') - JOB: $(basename $BASH_SOURCE)\n\n/" >&2) 2>> file.log 
echo This goes to stderr >&2 

私はthis他のポストからの情報を使用し、そこに最後のリダイレクトが2>> file.logの代わりに>> file.logですが、私はこのようにそれを行うならば、私は上の標準エラー出力を取得しますコンソール(接頭辞も追加されています)、およびファイルのstdoutが表示されます。

22>> file.logに追加した理由は、sedの置き換えもstderrに出力されるため、リダイレクトは正しく動作しますが、接頭辞は追加されないためです。だから、代わりに取得:

20170729100156 - JOB: script.sh 

This goes to stderr 

Iのみを取得:

This goes to stderr 

は、誰もが解決策をお勧めすることができ、または、なぜこれが起こっているのでしょうか?ありがとう。

+0

エラーをテンポラリファイルにリダイレクトしてからテンポラリファイルの出力を取り出し、必要な日付とスクリプトパスのデータを追加してからメインエラーファイルに追加できますか? –

+0

ありがとうございますが、正直言って、良い解決策のようには見えません。また、私が投稿したものはうまくいくはずですが、私は何が欠けているのか分かりません。 – Johnny16

+0

このテクニックは私にとって初めてのことですが、あなたのコードが失敗する理由は、 '' file.log'または '' 2 >> file.log'が '' echo''の出力をリダイレクトするのではなく、 'sed ...'プロセス。 – Beta

答えて

1

sedの出力を直接ログファイルに直接リダイレクトしないのはなぜですか?

exec 2> >(sed "s/^/\n$(date +'%Y%m%d%H%M%S') - JOB: $(basename $BASH_SOURCE)\n\n/" >> file.log) 
echo This goes to stderr >&2 
+0

それを考えなかった。ありがとう、それは働いた。 – Johnny16

関連する問題