为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
互换的青春 2023-06-05 09:14:43
我试图让一根管子通向cmd.ExtraFiles我目前有错误说cannot use cmdstdout (type io.ReadCloser) as type []byte in argument to pipeR.Readcannot use cmdstdout (type io.ReadCloser) as type []byte in argument to fd3.Write这是我到目前为止的 gocodecmd2 = 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 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

这些类型在这里并不完全一致。具体来说,

cmd.StdoutPipe

返回一个io.ReadCloser

然而

pipeR.Read

期待[]byte作为输入。

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

}


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信