How to pipe several commands in Go?
go, pipe
Solution
StdoutPipe returns a pipe that will be connected to the command's standard output when the command starts. The pipe will be closed automatically after Wait sees the command exit.
(from http://golang.org/pkg/os/exec/#Cmd.StdinPipe )
The fact you do `c1.Wait` closes the `stdoutPipe`.
I made a working example (just a demo, add error catching!) :
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)
}
Problem
How can I pipe several external commands together in Go? I've tried this code but I get an error that says `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) } ```