cmd.ExtraFiles завершается ошибкой при попытке передачи по каналу - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь заставить трубу перейти к 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

Это у меня пока есть гокод

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

1 Ответ

0 голосов
/ 29 января 2019

Типы здесь не совсем совпадают.В частности,

cmd.StdoutPipe

возвращает io.ReadCloser

, тогда как

pipeR.Read

ожидает []byte в качестве ввода.

Я верю вамв конечном итоге намереваются использовать функции Read и Write пакета os для выполнения вашей задачи, как показано ниже:

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()

}

...