Script Bash - executa o aplicativo e mostra a saída ao vivo

4

Eu tenho um script bash que configura alguns parâmetros de ambiente e, em seguida, executa um aplicativo c ++.

O aplicativo c ++ exibe informações mostrando seu estado atual durante a execução.

Atualmente, só vejo os resultados disso depois de concluído. (aproximadamente 1 min) Existe alguma maneira de ter o script bash mostrando a saída ao vivo do aplicativo?

Isso é o que eu tenho até agora:

OUTPUT="$(sudo ./test_app -release)"    
echo $OUTPUT

Eu recebo o seguinte quando o aplicativo foi concluído.:

release acknowledgereleasingstage1stage2released

Se eu executasse o aplicativo diretamente da linha de comando, eu obteria isso como uma nova linha, à medida que cada processo fosse concluído, e não tudo em um quando o aplicativo fosse concluído.

release acknowledge
releasing
stage1
stage2
released

Alguma idéia de como fazer isso? Gostaria de chamar o aplicativo do script bash para salvar os usuários que precisam executar vários comandos.

Obrigado.

    
por user214292 26.02.2016 / 16:16

2 respostas

2

Supondo que você não precisa armazenar a saída por nenhum motivo específico, basta substituir

OUTPUT="$(sudo ./test_app -release)"    
echo $OUTPUT

com

sudo ./test_app -release

Não há diferença especial em scripts de shell entre comandos incorporados e comandos não incorporados (no nível básico). Todos eles apenas executam e produzem coisas.

    
por 26.02.2016 / 20:58
2

Se você quiser mostrar a saída e não precisar salvá-la, basta executar o comando:

sudo ./test_app -release

Se você deseja salvar a saída e exibi-la, chame tee para duplicar a saída.

OUTPUT=$(sudo ./test_app -release | tee /dev/stderr)

Quando você redireciona a saída, o aplicativo pode armazenar em buffer sua saída em grandes blocos, em vez de linha por linha. Linha por linha é o padrão apenas quando a saída é um terminal, não quando é um canal ou um arquivo regular. Se esse for o caso de seu aplicativo, chame unbuffer ou stdbuff . Devido a a maneira como eles funcionam , stdbuf precisa ser invocado pelo sudo, enquanto buffer pode ser executado como você.

OUTPUT=$(sudo stdbuf ./test_app -release | tee /dev/stderr)
OUTPUT=$(unbuffer sudo ./test_app -release | tee /dev/stderr)
    
por 27.02.2016 / 01:21