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.

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.