Tee não obtém saída inteira do tubo

5

Eu tenho um script executando comandos como:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"

O problema provavelmente está no pipe para tee . Não parece obter toda a saída. Quando o aplicativo encerra as últimas linhas da saída (geralmente aquelas que contêm um erro fatal) estão faltando. Quando eu executo o aplicativo sem pipe para tee , eu os obtenho na saída.

Como posso forçar o script a esperar pelo tee para concluir o processamento de toda a saída?

    
por Ladislav Mrnka 23.06.2015 / 12:22

2 respostas

13

O erro fatal provavelmente está saindo em STDERR (2), não em STDOUT (1). Você pode redirecionar STDERR para STDOUT com 2>&1 e, em seguida, o pipe também deve capturá-lo.

./some_app -i $INDEX 2>&1 | tee $LOG

Se você tiver problemas de buffer no topo, você pode forçá-lo a um estado sem buffer:

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG
    
por Oli 23.06.2015 / 12:26
3

Como as mensagens de erro são normalmente mostradas no STDERR (descritor de arquivo 2), você precisa redirecionar o STDOUT e o STDERR para tee :

./some_app -i "$INDEX" |& tee "$LOG"

Quando você faz ./some_app -i $INDEX | tee $LOG , você está apenas redirecionando o STDOUT para tee .

|& fará com que tanto o STDOUT quanto o STDERR sejam redirecionados.

Se você não puder redirecionar somente o STDOUT (como você estava):

./some_app -i "$INDEX" | tee "$LOG"

Por outro lado, se você quiser redirecionar apenas o STDERR:

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"
    
por heemayl 23.06.2015 / 12:29