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

时间:2009-12-09 21:33:19

标签: go

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

8 个答案:

答案 0 :(得分:149)

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

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(),而{{1}}会返回标准输出和标准错误。

答案 1 :(得分:13)

要将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())

答案 2 :(得分:3)

 import urllib3
 http = urllib3.PoolManager()
 url = 'http://testing-ground.scraping.pro/login?mode=login'
 req = http.request('POST', url, fields={'usr':'admin','pwd':'12345'})
 print(req.data.decode('utf-8'))

cmd := exec.Command("ls", "-al")
output, _ := cmd.CombinedOutput()
fmt.Println(string(output))

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

  1. os.ForkExec()
  2. exec.Run()

答案 5 :(得分:0)

我将此用于最新版本的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")

答案 6 :(得分:0)

如果您想要 string 输出,strings.Builderbytes.Buffer 更有效 [1] package main import ( "os/exec" "strings" ) func main() { c, b := exec.Command("go", "version"), new(strings.Builder) c.Stdout = b c.Run() print(b.String()) }

<div class="skill">
                <h4>Javascript</h4>
                <div class="progress-bar" data-label="Loading..." style="--width: 10">
                </div>
              </div>
              <div class="skill">
                <h4>Wordpress</h4>
                <div class="progress-bar" data-label="Loading..." style="--width: 10">
              </div>
              <div class="skill">
                <h4>Java</h4>
                <div class="progress-bar" data-label="Loading..." style="--width: 10">
                </div>
              </div>
              <div class="skill">
                <h4>Bootstrap</h4>
                <div class="progress-bar" data-label="Loading..." style="--width: 10">
                </div>
  1. https://golang.org/pkg/bytes#Buffer.String

答案 7 :(得分:-1)

编辑:此答案已过时。请参阅下面的Fatih Arslan's answer


通过将exec.Run指定为标准输出(和stderr,如果需要),使用Pipe。它将返回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))
    }
}
相关问题