代码之家  ›  专栏  ›  技术社区  ›  nadermx

试图通过管道传输到该文件时,cmd.extrafiles失败

  •  1
  • nadermx  · 技术社区  · 7 年前

    我想用一根管子去 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 ,并通过 ExtraFiles

    1 回复  |  直到 7 年前
        1
  •  1
  •   daplho    7 年前

    这里的类型不太一致。明确地,

    cmd.StdoutPipe
    

    返回一个 io.ReadCloser

    反之

    pipeR.Read
    

    期待着 []byte 作为输入。

    我相信你最终会利用 Read Write 的功能 os package 要完成以下任务:

    package main
    
    import (
        "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()
    

    }