Como capturar a primeira linha de stdout da substituição do processo bash?

0

Estou trabalhando com o seguinte bloco de bash e não está imprimindo a primeira linha de saída esperada:

    exec 3< <(python3 -m http.server)
    while true; do
            read -t 2 line
            echo "reading..."
            echo "$line"
    done <&3

Quando python3 -m http.server inicia, imprime uma linha Serving HTTP on 0.0.0.0 port 8000 , mas o código acima não imprime essa linha. Posteriormente, o Python imprimirá coisas como solicitações GET conforme elas ocorrem e elas são impressas. Por que o bash está perdendo essa primeira linha?

Meu objetivo é colocar isso em um script e substituir as chamadas echo por um teste do processo redirecionado, indicando que ele acabou de iniciar e interromper o loop e finalizar o script (portanto, bloquear a execução do script até que a inicialização seja concluída), com o processo redirecionado continuando em segundo plano. http.server é apenas o meu caso de teste.

    
por ws_e_c421 10.06.2015 / 13:38

1 resposta

1

Isso porque:

    O
  • python executa o buffer de saída se for redirecionado para um canal ou arquivo.
  • http.server escreve a primeira linha para stdout e depois acessa os logs para stderr.

Você precisa fazer como:

exec 3< <(python3 -u -m http.server 2>&1)

Falando sobre sua meta, suponho que o script precise continuar lendo o canal mesmo depois de obter essa saída específica, porque o subprocesso deixará de ser executado assim que sua saída para o canal for bloqueada.

    
por 10.06.2015 / 17:11