[英]exec.Command: Scanner stops before command is complete when cmd includes a sleep
package main
import (
"bufio"
"fmt"
"io"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("sh", "-c",
`for i in $(seq 1 10000); do
echo '{"Name": "Bob", "Age": 32}'
sleep $(( ${RANDOM}%5)) # <<<< Stops before reading all lines when uncommented
done`,
)
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
printOutput(stdout)
if err := cmd.Wait(); err != nil {
log.Fatal(err)
}
}
func printOutput(r io.Reader) {
scanner := bufio.NewScanner(r)
var x = 1
for scanner.Scan() {
fmt.Println(x, scanner.Text())
x++
}
if err := scanner.Err(); err != nil {
fmt.Println("reading input:", err)
}
}
当sleep $(( ${RANDOM}%5))
被注释时,扫描器读取所有 10K 行并打印出来。 但是,当取消注释时,程序会在打印出所有行之前退出。 扫描器可能会提前退出,因为它将空的 pipe 解释为 EOF。
有没有办法完全读取命令的标准输出,直到它退出(而不是过早终止)?
您的代码不是有效的sh
语法,但希望sh
为bash
。 虽然这在某些系统上是相同的,但在其他系统上却不是。 在这些方面,它打破了:
arithmetic expression: expecting primary: " %5"`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.