0
0
0
DukeAnn 的个人博客 / 400 / 0 / 创建于 3年前 / 更新于 1年前
func CmdPipeRun(cmdS ...*exec.Cmd) (stdout, stderr *bytes.Buffer, err error) {
var out io.ReadCloser
var in io.WriteCloser
for i, cmd := range cmdS {
if i > 0 {
// 上一个指令的输出
out, err = cmdS[i-1].StdoutPipe()
if err != nil {
return
}
// 当前指令的输入
in, err = cmd.StdinPipe()
if err != nil {
return
}
// 阻塞指令进行,直到 Close()
go cmdPipe(cmdS[i-1], out, in)
}
if i == len(cmdS)-1 {
stdout, stderr = SetCommandStd(cmd)
}
}
for _, cmd := range cmdS {
err = cmd.Run()
if err != nil {
return
}
}
return
}
func cmdPipe(cmd *exec.Cmd, r io.ReadCloser, w io.WriteCloser) {
defer func() {
_ = r.Close()
_ = w.Close()
}()
_, err := io.Copy(w, r)
if err != nil {
fmt.Println("error: ", err)
}
return
}
func SetCommandStd(cmd *exec.Cmd) (stdout, stderr *bytes.Buffer) {
stdout = &bytes.Buffer{}
stderr = &bytes.Buffer{}
cmd.Stdout = stdout
cmd.Stderr = stderr
return
}