exe c .Command: Сканер останавливается до завершения команды, когда cmd включает спящий режим - PullRequest
1 голос
/ 05 апреля 2020
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.

Есть ли способ полностью прочитать стандартный вывод команды, пока она не завершится (и не завершится преждевременно)?

1 Ответ

1 голос
/ 05 апреля 2020

Ваш код недействителен sh синтаксис, но ожидается, что sh будет bash. Хотя в одних системах это то же самое, в других - нет. На них он распадается с:

arithmetic expression: expecting primary: " %5"`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...