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

标签 go pipe

我正在尝试通过管道连接到 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 通过 Stdin 通过 cmd3 接受输入,并通过 ExtraFiles

通过管道输出 cmd1

最佳答案

这里的类型不太一致。具体来说,

cmd.StdoutPipe

返回一个io.ReadCloser

鉴于

pipeR.Read

需要一个 []byte 作为输入。

我相信您最终希望利用 ReadWrite 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()

关于go - cmd.ExtraFiles 尝试通过管道传输时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54412764/

相关文章:

go - 如何关闭或清理标准输出管道?

GO - 方法重新声明错误

linux - 如何在 xclip 上复制并在 shell 上查看命令输出?

c - 将输入发送到程序并取回控制权

linux - Bash:使用管道运算符时陷阱 ERR 不起作用

pipe - 在 Julia 中,如何运行外部程序并逐行处理其输出?

algorithm - 附加字符串和数组的类似 Go 函数未按预期运行

model-view-controller - Beego - 创建模型表单和 ORM

templates - 在 golang 模板中迭代 Map/Dictionary

perl - 如何通过命令行或脚本将 perl 脚本的输出通过管道传输到另一个脚本