Golang 使用执行命令带管道符执行的方法

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
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
做自己
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!