Оболочка Linux: как добавить префикс строки в сообщение stderr?

2035
Fisher

Я выполняю несколько задач одновременно в фоновом режиме.

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 
3

1 ответ на вопрос

4
glenn jackman

bash process substitutions:

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

You don't need to pipe to tee if you just redirect it's stdout to a file.

You can even do fancy stuff like print a timestamp:

$ { date echo stdout sleep 3 echo stderr >&2 } 2> >(gawk '' >&2) > file.log 
foobar: [2015-02-24 11:43:32] stderr 
$ cat file.log 
Tue Feb 24 11:43:29 EST 2015 stdout 

Stick it in a function for re-use:

log_stderr() { gawk -v pref="$1" '' >&2 } command_a > command_a.log 2> >(log_stderr "command_a") 
Насколько я понимаю, 2> redirect all stderr,> () - это перенаправление на команду, sed используется для добавления префикса, после того, как сообщение sed становится stdout,> & 2 преобразует сообщение обратно в stderr, наконец, сохраняет его в файле журнала. Мое понимание верно? Спасибо! @glenn Jackman Fisher 9 лет назад 0
да, кроме `> ()` называется "подстановка процесса" glenn jackman 9 лет назад 0
@ Рыбак, вы можете * принять * ответ, если он отвечает на ваш вопрос (это [так] способ сказать «спасибо») umläute 6 лет назад 0

Похожие вопросы