2016-09-13 90 views
0

我有下面的代碼從標準輸出輸出數據到一個文件:如何從標準輸出輸出到一個字符串中golang

cmd := exec.Command("ls","lh") 
outfile, err := os.Create("./out.txt") 
if err != nil { 
    panic(err) 
} 
defer outfile.Close() 

stdoutPipe, err := cmd.StdoutPipe() 
if err != nil { 
    panic(err) 
} 

writer := bufio.NewWriter(outfile) 
defer writer.Flush() 

err = cmd.Start() 
if err != nil { 
    panic(err) 
} 

go io.Copy(writer, stdoutPipe) 
cmd.Wait() 

我需要從標準輸出輸出到一個字符串值,而不是文件。我如何實現這一目標?

是否有另一個函數,可以讓我更改io.Copy行去io.Copy(myStringVariable,stdoutPipe),因爲我需要讀取命令的輸出並對其應用一些處理?

在此先感謝

+0

您可能剛剛將該文件分配爲命令的Stdout,並避免了管道和複製goroutine(其中您正在丟失讀/寫錯誤), – JimB

回答

5

你不需要管,作家,夠程等只需使用Cmd.Output

out, err := exec.Command("ls","lh").Output() 

您可以根據需要與string(out)

+0

簡而又甜!謝謝 –

0

使用bytes.Buffer。它本質上是一個[]byte,它還實現了io.Reader和io.Writer接口(等等)。

cmd := exec.Command("ls","lh") 

stdoutPipe, err := cmd.StdoutPipe() 
if err != nil { 
    panic(err) 
} 

var buf bytes.Buffer 
writer := bufio.NewWriter(buf) 
defer writer.Flush() 

err = cmd.Start() 
if err != nil { 
    panic(err) 
} 

go io.Copy(writer, stdoutPipe) 
cmd.Wait() 
fmt.Println(string(buf.Bytes())) 
2

您可以將輸出[]byte轉換爲string設置文件爲命令的stdout

f, err := os.Create("./out.txt") 
if err != nil { 
    panic(err) 
} 
defer f.Close() 

cmd := exec.Command("ls", "-lh") 
cmd.Stdout = f 
cmd.Stderr = os.Stderr 

if err := cmd.Run(); err != nil { 
    panic(err) 
}