2009-12-09 123 views
19

比方说,我想在走程序运行“LS”,并将结果存储在一个字符串。似乎有叉在exec和OS包处理的几个命令,但他们需要为标准输出文件参数等是否有办法让输出作为一个字符串?如何在Go中获得系统命令的输出?

回答

4

使用exec.Run。它会返回CMD,其中包含在标准输出(和标准错误)领域的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)) 
    } 
} 
+3

我不认为“exec”包存在了。我不得不使用下面Fatih列出的“os/exec”。 – 2015-08-18 04:25:51

2

使用exec.Run,穿线管的标准输出。从它返回的管道读取。

+0

这应该可能是因为exec.Run()(返回一个CMD),而不是Cmd的被称为。跑。 – esm 2009-12-10 04:25:53

+0

哎呦。谢谢。 – Glomek 2009-12-10 05:14:48

1

两个选项,根据不同的模式,你喜欢:通过指定Pipe作为标准输出(和标准错误,如果你想)

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

现在有一个简单的方法:

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()返回标准输出和标准错误。

+3

这应该很可能是现在接受的答案。接受的答案甚至不再编译。 – 2017-08-01 19:35:27

2

要获得这两个输出和错误到单独的字符串,你可以使用一个字节的缓冲区,像这样:

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()) 
相关问题