繁体   English   中英

exec.Command:当 cmd 包含睡眠时,扫描仪在命令完成之前停止

[英]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语法,但希望shbash 虽然这在某些系统上是相同的,但在其他系统上却不是。 在这些方面,它打破了:

arithmetic expression: expecting primary: " %5"`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM