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 cano para tee
. Parece que não obtém toda a saída. Quando o aplicativo sai, faltam as últimas linhas da saída (geralmente aquelas que contêm um erro fatal). Quando executo o aplicativo sem canal tee
, os recebo na saída.
Como forçar o script a aguardar que o tee conclua o processamento de toda a saída?
Respostas:
O erro fatal provavelmente está saindo em STDERR (2), não em STDOUT (1). Você pode redirecionar o STDERR para o STDOUT com
2>&1
e o pipe também deve capturá-lo.Se você tiver problemas de armazenamento em buffer, poderá forçá-lo a um estado sem buffer:
fonte
Como as mensagens de erro normalmente são mostradas no STDERR (descritor de arquivo 2), você precisa redirecionar o STDOUT e o STDERR para
tee
:Quando você
./some_app -i $INDEX | tee $LOG
está redirecionando apenas o STDOUT paratee
.|&
fará com que STDOUT e STDERR sejam redirecionados.Se você não pode redirecionar apenas o STDOUT (como estava):
Por outro lado, se você deseja redirecionar apenas o STDERR:
fonte