如何在Go中将多个外部命令通过管道传递?我已经试过了这段代码,但是看到一条错误消息exit status 1。
exit status 1
package main import ( "io" "log" "os" "os/exec" ) func main() { c1 := exec.Command("ls") stdout1, err := c1.StdoutPipe() if err != nil { log.Fatal(err) } if err = c1.Start(); err != nil { log.Fatal(err) } if err = c1.Wait(); err != nil { log.Fatal(err) } c2 := exec.Command("wc", "-l") c2.Stdin = stdout1 stdout2, err := c2.StdoutPipe() if err != nil { log.Fatal(err) } if err = c2.Start(); err != nil { log.Fatal(err) } if err = c2.Wait(); err != nil { log.Fatal(err) } io.Copy(os.Stdout, stdout2) }
StdoutPipe返回一条管道,该管道将在命令启动时连接到命令的标准输出。在Wait看到命令退出后,管道将自动关闭。
(来自http://golang.org/pkg/os/exec/#Cmd.StdinPipe)
您确实c1.Wait关闭了事实stdoutPipe。
c1.Wait
stdoutPipe
我做了一个工作示例(只是一个演示,添加了错误捕获功能!):
package main import ( "bytes" "io" "os" "os/exec" ) func main() { c1 := exec.Command("ls") c2 := exec.Command("wc", "-l") r, w := io.Pipe() c1.Stdout = w c2.Stdin = r var b2 bytes.Buffer c2.Stdout = &b2 c1.Start() c2.Start() c1.Wait() w.Close() c2.Wait() io.Copy(os.Stdout, &b2) }