当前位置: > > > > exec.Command:当 cmd 包含睡眠时,扫描程序在命令完成之前停止
来源:stackoverflow
2024-04-25 12:27:27
0浏览
收藏
知识点掌握了,还需要不断练习才能熟练运用。下面给大家带来一个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
语法,但期望 sh
为 bash
。虽然这在某些系统上是相同的,但在其他系统上则不然。在这些方面,它与以下内容不同:
arithmetic expression: expecting primary: " %5"`
今天关于《exec.Command:当 cmd 包含睡眠时,扫描程序在命令完成之前停止》的内容介绍就到此结束,如果有什么疑问或者建议,可以在公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!