runner: pipe commands together
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package runner
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"os/exec"
|
||||
@@ -26,3 +27,33 @@ func (runner *ZRunner) Run(ctx context.Context, command string, formatArgs ...an
|
||||
cmd := exec.Command(runner.Prog, args...)
|
||||
return cmd.CombinedOutput()
|
||||
}
|
||||
|
||||
func Pipeline(cmds ...*exec.Cmd) ([]byte, error) {
|
||||
for i := 0; i < len(cmds)-1; i++ {
|
||||
stdout, err := cmds[i].StdoutPipe()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cmds[i+1].Stdin = stdout
|
||||
}
|
||||
|
||||
out := bytes.Buffer{}
|
||||
|
||||
cmds[len(cmds)-1].Stdout = &out
|
||||
|
||||
for _, cmd := range cmds {
|
||||
err := cmd.Start()
|
||||
if err != nil {
|
||||
return out.Bytes(), err
|
||||
}
|
||||
}
|
||||
|
||||
for _, cmd := range cmds {
|
||||
err := cmd.Wait()
|
||||
if err != nil {
|
||||
return out.Bytes(), err
|
||||
}
|
||||
}
|
||||
|
||||
return out.Bytes(), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user