如何从 bash 进程替换中捕获标准输出的第一行?

如何从 bash 进程替换中捕获标准输出的第一行?

我正在使用以下 bash 块,它没有打印出预期输出的第一行:

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

启动时python3 -m http.server,它打印出一行Serving HTTP on 0.0.0.0 port 8000,但上面的代码不打印该行。之后,Python 将在 GET 请求发生时打印这些内容并打印这些内容。为什么 bash 缺少第一行?

我的目标是将其放入脚本中,并echo用重定向进程的测试替换调用,表明它已完成启动,然后打破循环并结束脚本(因此阻止脚本执行,直到启动完成) ,重定向的进程在后台继续进行。http.server这只是我的测试用例。

答案1

那是因为:

  • 如果重定向到管道或文件,python 会执行输出缓冲。
  • http.server将第一行写入 stdout,然后将日志访问到 stderr。

你需要这样做:

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

谈到您的目标,我想脚本即使在获得特定输出后也需要继续从管道读取,因为一旦到管道的输出被阻止,子进程就会停止运行。

相关内容