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行,并打印这些行。但是,当取消注释时,程序会在打印出所有行之前退出。扫描仪可能会提前退出,因为它将空管道解释为EOF。
有没有一种方法可以完全读取命令的stdout,直到它退出(而不是提前终止(?
您的代码不是有效的sh
语法,但要求sh
为bash
。虽然这在某些系统上是相同的,但在其他系统上则不同。在这些方面,它与决裂
arithmetic expression: expecting primary: " %5"`