Linux shell: como adicionar uma string de prefixo à mensagem stderr?

3

Estou executando várias tarefas simultaneamente no plano de fundo.

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

Se tudo estiver bem, as mensagens serão salvas nos arquivos de log.

Se algo estiver errado, os erros serão impressos na tela.

Mas o comando_a e o comando_b são bastante semelhantes, é difícil dizer qual mensagem de erro é gerada por qual comando.

Posso adicionar uma string de prefixo a mensagens de erro, como:

command_a: error 123
command_b: error 456
command_a: error 256
command_a: error 555
command_b: error 333
    
por Fisher 24.02.2015 / 17:23

1 resposta

4

bash substituições de processos :

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

Você não precisa canalizar para tee se apenas redirecionar seu stdout para um arquivo.

Você pode até fazer coisas extravagantes, como imprimir um timestamp:

$ {
  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

Coloque-o em uma função para reutilização:

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

command_a > command_a.log 2> >(log_stderr "command_a")
    
por 24.02.2015 / 17:41

Tags