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) } ```

Original source

Related problems