首页 >后端开发 >Golang >如何在 Go 的 `exec.Command()` 中正确管道命令输出?

如何在 Go 的 `exec.Command()` 中正确管道命令输出?

DDD
DDD原创
2024-12-15 05:24:10991浏览

How to Properly Pipe Command Outputs in Go's `exec.Command()`?

如何在 Go 的 exec.Command() 中通过管道传输命令链的结果

当在 Go 中使用 exec.Command() 执行命令时,通过管道传输一个命令的输出向他人发出命令可能具有挑战性。

请考虑以下事项例如:

out, err := exec.Command("ps", "cax").Output() // Works and prints command output

但是,当尝试将 ps 的输出通过管道传输到 grep 时,该命令失败,退出状态为 1:

out, err := exec.Command("ps", "cax | grep myapp").Output() // Fails

惯用管道解决方案

要解决这个问题,更惯用的方法是对每个命令使用 exec.Command() 并直接连接其标准输入/输出流。操作方法如下:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    grep := exec.Command("grep", "redis")
    ps := exec.Command("ps", "cax")

    // Connect ps's stdout to grep's stdin.
    pipe, _ := ps.StdoutPipe()
    defer pipe.Close()
    grep.Stdin = pipe

    // Start ps first.
    ps.Start()

    // Run and get the output of grep.
    res, _ := grep.Output()

    fmt.Println(string(res))
}

这允许您执行多个命令并根据需要通过管道传输它们的输入和输出,从而提供灵活的方式来处理命令链。

以上是如何在 Go 的 `exec.Command()` 中正确管道命令输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn