如何在GO中通过管道将几个外部命令连接在一起?我已经try 过此代码,但得到的错误显示为exit status 1.

package main

import (
    "io"
    "log"
    "os"
    "os/exec"
)

func main() {
    c1 := exec.Command("ls")
    stdout1, err := c1.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err = c1.Start(); err != nil {
        log.Fatal(err)
    }
    if err = c1.Wait(); err != nil {
        log.Fatal(err)
    }

    c2 := exec.Command("wc", "-l")
    c2.Stdin = stdout1

    stdout2, err := c2.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err = c2.Start(); err != nil {
        log.Fatal(err)
    }
    if err = c2.Wait(); err != nil {
        log.Fatal(err)
    }

    io.Copy(os.Stdout, stdout2)
}

推荐答案

StdoutPipe返回一个管道,该管道将连接到命令的

(从http://golang.org/pkg/os/exec/#Cmd.StdinPipe开始)

事实是你做了c1.Wait次就关闭了stdoutPipe次.

我做了一个工作示例(只是一个演示,添加错误捕捉!):

package main

import (
    "bytes"
    "io"
    "os"
    "os/exec"
)

func main() {
    c1 := exec.Command("ls")
    c2 := exec.Command("wc", "-l")

    r, w := io.Pipe() 
    c1.Stdout = w
    c2.Stdin = r

    var b2 bytes.Buffer
    c2.Stdout = &b2

    c1.Start()
    c2.Start()
    c1.Wait()
    w.Close()
    c2.Wait()
    io.Copy(os.Stdout, &b2)
}

Go相关问答推荐

使用ciph.AEAD.Seal()查看内存使用情况

为什么(编码器).EncodeElement忽略";,innerxml";标记?

如何给杜松子wine 的路由加上一个名字,比如Laravel ?

JetBrains Goland,禁用突出显示测试文件

golang regex基于关键字拆分字符串

在 Go 中将元数据从一个 JPEG 复制到另一个

Json.Unmarshal() 和 gin.BindJson() 之间的区别

是否需要手动调用rand.Seed?

如何在 Go 中将 int 转换为包含 complex128 的泛型类型?

Go http.FileServer 给出意外的 404 错误

如何在切片增长时自动将切片的新元素添加到函数参数

Protobuf.Any - 从 json.RawMessage 解组

在 Golang 中,如何将接口作为泛型类型与 nil 进行比较?

使用 package`regexp` 查找 Golang 中的所有 mactch 子字符串,但得到意外结果

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

无法在 GORM 中排序

curl:(56)Recv失败:连接由golang中的对等方与docker重置

显示作为服务帐户身份验证的谷歌日历事件 - Golang App

Go:如何创建一个可以提供配置文件中描述的 url 的服务器

在 go (1.18) 的泛型上实现多态的最佳方法是什么?