我希望在Go中执行一个shell命令,并在程序中以字符串形式获得结果输出.我看到了Rosetta Code版:

package main
import "fmt"
import "exec"

func main() {
  cmd, err := exec.Run("/bin/ls", []string{"/bin/ls"}, []string{}, "", exec.DevNull, exec.PassThrough, exec.PassThrough)
  if (err != nil) {
    fmt.Println(err)
    return
  }
  cmd.Close()

但这并没有以我可以编程访问的方式捕获实际的标准输出或错误——这些仍然打印到常规的stdout/stderr.我发现使用管道作为输出或错误可以在其他地方有所帮助,但没有关于如何做到这一点的例子.有什么 idea 吗?

推荐答案

This answer does not represent the current state of the Go standard library. Please take a look at 100 for an up-to-date method!


您的示例实际上并不从stdout读取数据.这个很适合我.

package main

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

func main() {
    app := "/bin/ls"
    cmd, err := exec.Run(app, []string{app, "-l"}, nil, "", exec.DevNull, exec.Pipe, exec.Pipe)

    if (err != nil) {
       fmt.Fprintln(os.Stderr, err.String())
       return
    }

    var b bytes.Buffer
    io.Copy(&b, cmd.Stdout)
    fmt.Println(b.String())

    cmd.Close()
}

Go相关问答推荐

如何在gocql中设置gocqlSYS标志?

Go编译器标志-修剪路径不完全工作

在Mac中使用uname获取处理器体系 struct 时,在为AMD64构建Go二进制时出现错误结果

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

Go中的net.SplitHostPort(r.RemoteAddr)安全性

无法在32位计算机上运行Golang应用程序

用 fork 替换 Go 依赖:...用于两个不同的模块路径

将字符串格式的x509证书生成主题名称

同一文件上的多个 Arrow CSV 阅读器返回 null

最长连续重复的字符golang

golang中如何声明多个接口约束?

我如何使用 TOML fixtures 在使用 Go Buffalo 框架的开发环境中为我的数据库 seeder ?

为什么 `append(x[:0:0], x...)` 将切片复制到 Go 中的新后备数组中?

从数据库中带有 imageurl 的文件夹中获取图像,并在我的浏览器中用 golang 中的 echo 显示

使用 Golang 在字符串中循环重复数据

自定义指标未显示在 prometheus web ui 中,grafana 中也是如此

如何在 Windows 中使用 github.com/AllenDang/giu 和 github.com/gordonklaus/portaudio 构建 GO 程序

在 Golang 中获取谷歌云服务帐户的访问令牌?

GOLANG 如何使用 http.FileServer 从模板目录加载某个 html 文件

Go 错误:Is() 和 As() 声称是递归的,是否有任何类型实现错误接口并支持这种递归 - 无错误?