首页 >后端开发 >Golang >为什么 Go 的 exec.Command() 中的管道命令失败,如何修复?

为什么 Go 的 exec.Command() 中的管道命令失败,如何修复?

Susan Sarandon
Susan Sarandon原创
2024-12-16 11:03:14120浏览

Why Does Piping Commands in Go's `exec.Command()` Fail, and How Can I Fix It?

使用 exec.Command() 在 Go 中执行管道命令

问题:管道命令失败,退出状态为 1

尝试使用 exec.Command() 通过管道传输命令时,出现以下错误发生:

ps, "cax | grep myapp"

为什么这个命令在 ps cax 工作时失败?

A:使用 exec.Command() 进行惯用管道

通过bash 的整个命令可以解决该问题,但还有一个更惯用的方法解决方案:

  1. 为每个步骤创建单独的命令(ps 和 grep)。
  2. 使用管道连接它们的标准输入和输出。
  3. 先执行 ps,然后执行 grep .

代码示例:

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

    // Run ps first.
    ps.Start()

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

    fmt.Println(string(res))
}

说明:

  • grep 和 ps 作为单独的命令创建。
  • 创建管道从 ps 的 stdout 到 grep 的 stdin。
  • ps 已启动首先,确保其输出可用于 grep。
  • 然后执行 grep 并检索其输出,提供所需的结果。

以上是为什么 Go 的 exec.Command() 中的管道命令失败,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!

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