Comment attraper la première ligne de stdout à partir de la substitution de processus bash?

0

Je travaille avec le bloc suivant de bash et il n’imprime pas la première ligne de sortie attendue:

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

Une fois python3 -m http.serverdémarré, une ligne est imprimée Serving HTTP on 0.0.0.0 port 8000, mais le code ci-dessus n’imprime pas cette ligne. Ensuite, python imprimera des éléments tels que les demandes GET au fur et à mesure de leur apparition et de leur impression. Pourquoi bash manque-t-il cette première ligne?

Mon but est de mettre cela dans un script et de remplacer les echoappels par un test du processus redirigé indiquant qu'il a fini de démarrer, puis de casser la boucle et de terminer le script (bloquez donc l'exécution du script jusqu'à ce que le démarrage soit terminé) , avec le processus redirigé se poursuivant en arrière-plan. http.serverest juste mon cas de test.

ws_e_c421
la source

Réponses:

1

C'est parce que:

  • python effectue la mise en mémoire tampon de la sortie s’il est redirigé vers un canal ou un fichier.
  • http.server écrit la première ligne sur stdout puis accède aux journaux sur stderr.

Vous devez faire comme:

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

En ce qui concerne votre objectif, je suppose que le script doit continuer à lire dans le canal même après l’obtention de cette sortie spécifique, car le sous-processus cessera de s’exécuter dès que sa sortie dans le canal sera bloquée.

yaegashi
la source