我正在尝试通过管道传输多个*exec.Cmd
,然后写入文件。当我尝试使用一个cmd并输出到文件时,它将写入文件。但是,当我尝试使用多个命令并输出到文件时,却没有。但是exec.Cmd似乎正在传递,因为它可以正确输出。
outfile, err := os.Create("./out.txt")
if err != nil {
panic(err)
}
defer outfile.Close()
c1 := exec.Command("sh", "-c", "while sleep 1; do echo test; done")
c1.Stdout = outfile
_ = c1.Run()
for {
}
上面的代码每秒钟写入一次文件。 但是当我尝试这样做时:
outfile, err := os.Create("./out.txt")
if err != nil {
panic(err)
}
defer outfile.Close()
c1 := exec.Command("sh", "-c", "while sleep 1; do echo test; done")
c2 := exec.Command("grep", "t")
c2.Stdin, _ = c1.StdoutPipe()
c2.Stdout = outfile
_ = c2.Start()
_ = c1.Run()
c2.Wait()
这不会输出任何内容。
但是当我将c2.Stdout = outfile
更改为c2.Stdout = os.Stdout
时,它会正确打印输出
我不知道为什么会这样。任何帮助表示赞赏。
答案 0 :(得分:1)
因此,grep并未注意到它正在写入常规文件。
通过以下方式更改此行:
c2 := exec.Command("grep", "t")
这可以正常工作并正确写入文件
c2 := exec.Command("grep", "t", "--line-buffered")