我正在使用以下 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)
谈到您的目标,我想脚本即使在获得特定输出后也需要继续从管道读取,因为一旦到管道的输出被阻止,子进程就会停止运行。