如何在Go中获得系统命令的输出?

go

36489 观看

6回复

20147 作者的声誉

假设我想在go程序中运行'ls',并将结果存储在一个字符串中。似乎有一些命令在exec和os包中派生进程,但它们需要stdout等的文件参数。有没有办法将输出作为字符串?

作者: marketer 的来源 发布者: 2009 年 12 月 9 日

回应 (6)


2

19351 作者的声誉

使用exec.Run,传递Pipe for stdout。从它返回的管道中读取。

作者: Andru Luvisi 发布者: 09.12.2009 09:44

1

1312 作者的声誉

两种选择,取决于您喜欢的范例:

  1. os.ForkExec()
  2. exec.Run()
作者: esm 发布者: 10.12.2009 04:28

0

37793 作者的声誉

决定

编辑:这个答案已经过时了。请参阅下面的Fatih Arslan的回答


通过将Pipe指定为stdout(如果需要,还可以指定stderr)来使用exec.Run。它将返回cmd,其中包含Stdout(和Stderr)字段中的os.File。然后你可以使用例如ioutil.ReadAll来阅读它。

例:

package main

import (
    "exec";
    "io/ioutil";
)

func main() {
    if cmd, e := exec.Run("/bin/ls", nil, nil, exec.DevNull, exec.Pipe, exec.MergeWithStdout); e == nil {
        b, _ := ioutil.ReadAll(cmd.Stdout)
        println("output: " + string(b))
    }
}
作者: Randy Sugianto 'Yuku' 发布者: 11.12.2009 06:13

131

9029 作者的声誉

现在有一种更简单的方法:

package main

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

func main() {
    out, err := exec.Command("date").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("The date is %s\n", out)
}

out标准输出在哪里。它采用的格式[]byte,但您可以通过以下方式轻松将其更改为字符串:

string(out)

您也可以使用CombinedOutput() 而不是Output()返回标准输出和标准错误。

作者: Fatih Arslan 发布者: 04.04.2013 03:41

13

22632 作者的声誉

要将stdout和stderr都放入单独的字符串中,可以使用字节缓冲区,如下所示:

cmd := exec.Command("date")
var outb, errb bytes.Buffer
cmd.Stdout = &outb
cmd.Stderr = &errb
err := cmd.Run()
if err != nil {
    log.Fatal(err)
}
fmt.Println("out:", outb.String(), "err:", errb.String())
作者: Travis Reeder 发布者: 10.10.2016 11:27

0

711 作者的声誉

我用这个最新版本的GO(~1.11)

// CmdExec Execute a command
func CmdExec(args ...string) (string, error) {

    baseCmd := args[0]
    cmdArgs := args[1:]

    log.Debugf("Exec: %v", args)

    cmd := exec.Command(baseCmd, cmdArgs...)
    out, err := cmd.Output()
    if err != nil {
        return "", err
    }

    return string(out), nil
}

// Usage:
// out, err := CmdExec("ls", "/home")
作者: lcapra 发布者: 08.02.2019 04:57
32x32