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))
Сканер считывает все строки по 10 КБ, и те печатаются. Однако, когда он не закомментирован, программа завершает работу, прежде чем распечатать все строки. Возможно, сканер преждевременно завершает работу, потому что он интерпретирует пустой канал как EOF.
Есть ли способ полностью прочитать стандартный вывод команды, пока она не завершится (и не завершится преждевременно)?