登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-25 12:27:27 258浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《exec.Command:当 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。

有没有办法完全读取命令的标准输出,直到它退出(并且不会提前终止)?


解决方案


您的代码不是有效的 sh 语法,但期望 shbash。虽然这在某些系统上是相同的,但在其他系统上则不然。在这些方面,它与以下内容不同:

arithmetic expression: expecting primary: " %5"`

今天关于《exec.Command:当 cmd 包含睡眠时,扫描程序在命令完成之前停止》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>