执行官.命令:当cmd包含睡眠时,扫描程序在命令完成之前停止


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语法,但要求shbash。虽然这在某些系统上是相同的,但在其他系统上则不同。在这些方面,它与决裂

arithmetic expression: expecting primary: " %5"`

最新更新