猿问

cmd.ExtraFiles 尝试通过管道传输时失败

我试图让一根管子通向cmd.ExtraFiles


我目前有错误说


cannot use cmdstdout (type io.ReadCloser) as type []byte in argument to pipeR.Read

cannot use cmdstdout (type io.ReadCloser) as type []byte in argument to fd3.Write

这是我到目前为止的 gocode


cmd2 = exec.Command("-i", "pipe:0", "-i", "pipe:1")

cmd1 := exec.Command("command", "-o", "-")

pipeR, pipeW, _ := os.Pipe()

cmd2.ExtraFiles = []*os.File{

    pipeW,

}

cmd1.Start()

cmd1stdout, err := cmd1.StdoutPipe()

if err != nil {

    log.Printf("pipeThruError: %v\n", err)

    return err

}

fd3 := os.NewFile(3, "/proc/self/fd/3")

fd3.Write(cmd1stdout)

pipeR.Read(cmd1stdout)

pipeR.Close()

pipeW.Close()

fd3.Close()

cmd3 = exec.Command("command", "-o", "-")

stdin, stdinErr := cmd3.StdoutPipe()

if stdinErr != nil {

    log.Printf("pipeThruFStdinErr: %v\n", stdinErr)

    return stdinErr

}

cmd3.Start()

cmd2.Stdin = stdin

编辑:添加了完整范围目标是让 cmd2 通过 cmd3 接受输入Stdin,并让 cmd1 输出通过管道传输ExtraFiles


互换的青春
浏览 153回答 1
1回答

翻过高山走不出你

这些类型在这里并不完全一致。具体来说,cmd.StdoutPipe返回一个io.ReadCloser然而pipeR.Read期待[]byte作为输入。我相信您最终希望利用os 包的读取和写入功能来完成您的任务,如下所示:package mainimport (    "log"    "os"    "os/exec")func main() {    cmd := exec.Command("command", "-o", "-")    pipeR, pipeW, _ := os.Pipe()    cmd.ExtraFiles = []*os.File{        pipeW,    }    cmd.Start()    cmdstdout, err := cmd.StdoutPipe()    if err != nil {        log.Printf("pipeThruError: %v\n", err)        os.Exit(1)    }    buf := make([]byte, 100)    cmdstdout.Read(buf)    pipeR.Close()    pipeW.Close()    fd3 := os.NewFile(3, "/proc/self/fd/3")    fd3.Write(buf)    fd3.Close()}
随时随地看视频慕课网APP

相关分类

Go
我要回答