Estou trabalhando com um programa que gera mensagens de erro quando algo dá errado, mas não define seu status de saída de acordo: o status de saída é sempre 0, indicando sucesso. Eu gostaria de executar este programa a partir de um script de shell e obter um status de saída diferente de zero se ele emitir qualquer mensagem de erro, para que o script possa dizer que o programa falhou.
As mensagens de erro seguem um padrão previsível que eu posso igualar com grep
e grep
define seu status de saída com base em se encontrou uma correspondência, então posso enviar a saída do programa para grep
e negar o resultado com !
para obter o status de saída que desejo.
O problema é que, se eu canalizar para grep
, não consigo mais ver a saída do programa, porque grep
consome. Eu gostaria de de alguma forma digitalizar a saída para mensagens de erro, mas também exibir a saída normalmente, uma vez que existem outras mensagens importantes além dos erros. Infelizmente, grep
não tem uma opção para passar todas as suas linhas de entrada, correspondentes e não correspondentes.
Uma abordagem que eu acho que principalmente funciona é:
! my_program | tee /dev/stderr | grep -q "error message"
Isso alimenta a saída do programa em grep
, mas também copia para o erro padrão, que não é redirecionado, então eu posso vê-lo. Tudo bem quando a saída padrão e o erro padrão do meu script vão para um terminal (portanto, não importa qual recebe as mensagens), mas pode causar problemas se o padrão e o erro padrão forem redirecionados para locais diferentes; as mensagens acabarão no lugar errado.
Usando bash
ou shell POSIX e ferramentas GNU, existe uma maneira (concisa) de varrer os fluxos de erro padrão e / ou padrão de um programa com algo como grep
e definir o status de saída de acordo, mas também deixar ambos fluxos vão para seus destinos normais?
(Observe que my_program
grava suas mensagens de erro no padrão, não no erro padrão, portanto, uma solução que só pode varrer o fluxo de saída padrão é OK, embora não seja a ideal. E, caso isso faça diferença, fazendo isso no CentOS 7.)