Last active
August 29, 2015 14:18
-
-
Save zachcr/2a0a26b211f39ea22491 to your computer and use it in GitHub Desktop.
pipcmd.go
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func PipCmd(cmds []*exec.Cmd) (pipeLineOutput, collectedStandardError []byte, pipeLineError error) { | |
// Require at least one command | |
if len(cmds) < 1 { | |
return nil, nil, nil | |
} | |
// Collect the output from the command(s) | |
var output bytes.Buffer | |
var stderr bytes.Buffer | |
last := len(cmds) - 1 | |
for i, cmd := range cmds[:last] { | |
var err error | |
// Connect each command's stdin to the previous command's stdout | |
if cmds[i+1].Stdin, err = cmd.StdoutPipe(); err != nil { | |
return nil, nil, err | |
} | |
// Connect each command's stderr to a buffer | |
cmd.Stderr = &stderr | |
} | |
// Connect the output and error for the last command | |
cmds[last].Stdout, cmds[last].Stderr = &output, &stderr | |
// Start each command | |
for _, cmd := range cmds { | |
if err := cmd.Start(); err != nil { | |
return output.Bytes(), stderr.Bytes(), err | |
} | |
} | |
// Wait for each command to complete | |
for _, cmd := range cmds { | |
if err := cmd.Wait(); err != nil { | |
return output.Bytes(), stderr.Bytes(), err | |
} | |
} | |
// Return the pipeline output and the collected standard error | |
return output.Bytes(), stderr.Bytes(), nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment