2009-12-09 71 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()) 
相關問題