Linuxシェル:標準エラーメッセージにプレフィックス文字列を追加する方法?


3

バックグラウンドで同時に複数のタスクを実行しています。

command_a | tee > command_a.log &
command_b | tee > command_b.log &

すべて問題なければ、メッセージはログファイルに保存されます。

何か問題があると、画面にエラーが表示されます。

しかし、command_aとcommand_bは非常によく似ているので、どのエラーメッセージがどのコマンドによって生成されるのかを判断するのは困難です。

次のように、エラーメッセージにプレフィックス文字列を追加できますか。

command_a: error 123
command_b: error 456
command_a: error 256
command_a: error 555
command_b: error 333

回答:


4

バッシュ プロセス代替

command_a 2> >(sed 's/^/command_a: /' >&2) > command_a.log &
command_b 2> >(sed 's/^/command_b: /' >&2) > command_b.log &

にパイプする必要はありません tee あなたがただリダイレクトするなら、それはファイルに標準出力です。

あなたは、タイムスタンプをプリントするような空想的なことさえすることができます:

$ {
  date
  echo stdout
  sleep 3
  echo stderr >&2
} 2> >(gawk '{print "foobar:", strftime("[%F %T]", systime()), $0}' >&2) > file.log
foobar: [2015-02-24 11:43:32] stderr
$ cat file.log
Tue Feb 24 11:43:29 EST 2015
stdout

再利用のために関数に貼り付けてください。

log_stderr() {
    gawk -v pref="$1" '{print pref":", strftime("%F %T", systime()), $0}' >&2
}

command_a > command_a.log 2> >(log_stderr "command_a")

私の理解のために、2>すべてのstderrをリダイレクト、>()はコマンドにリダイレクトされます。sedは接頭辞を追加するために使用されます。私の理解は正しいですか?ありがとうございます。 @グレンジャックマン
Fisher

はい、以外 >() 「プロセス置換」と呼ばれます
glenn jackman

あなたがしたいかもしれない@Fisher 受け入れる それがあなたの質問に答えたら答え スタックオーバーフロー 「ありがとう」の言い方
umläute
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.