Escreva STDOUT & STDERR em um arquivo de log, também escreva STDERR na tela

Eu gostaria de executar vários comandos e capturar toda a saída em um arquivo de log. Também quero imprimir quaisquer erros na tela (ou, opcionalmente, enviar a saída para alguém).

Aqui está um exemplo. O comando a seguir executará três comandos e gravará todas as saídas (STDOUT e STDERR) em um único arquivo de log.

{ command1 && command2 && command3 ; } > logfile.log 2>&1

Aqui está o que eu quero fazer com a saída desses comandos:

STDERR e STDOUT para todos os comandos vão para um arquivo de log, caso eu precise mais tarde - normalmente não vou procurar aqui, a menos que haja problemas.Imprima STDERR na tela (ou, opcionalmente, canalize para / bin / mail), para que qualquer erro se destaque e não seja ignorado.

Seria bom se os códigos de retorno ainda fossem utilizáveis, para que eu pudesse fazer algum tratamento de erros. Talvez eu queira enviar um email se houver um erro, como este:

{command1 && command2 && command3; }> logfile.log 2> & 1 || mailx -s "Ocorreu um erro" [email protected]

O problema que encontro é que o STDERR perde o contexto durante o redirecionamento de E / S. Um '2> & 1' converterá STDERR em STDOUT e, portanto, não será possível exibir erros se eu fizer 2> error.log

Aqui estão alguns exemplos mais suculentos. Vamos fingir que estou executando alguns comandos familiares de construção, mas não quero que a compilação inteira pare apenas por causa de um erro; portanto, uso o sinalizador '--keep-going'.

{ ./configure && make --keep-going && make install ; } > build.log 2>&1

Ou, aqui está um script simples (e talvez desleixado) de compilação e implantação, que continuará em caso de erro.

{ ./configure && make --keep-going && make install && rsync -av --keep-going /foo devhost:/foo} > build-and-deploy.log 2>&1

Eu acho que o que eu quero envolve algum tipo deRedirecionamento de E / S do Bash, mas não consigo descobrir isso.

questionAnswers(5)

yourAnswerToTheQuestion