2016-09-13 10 views
0

I持っているファイルへの標準出力からデータを出力し、次のコード: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としてファイルを割り当てて、パイプとコピーゴルーチン(あなたが読み書きエラーを失っていた)を避けることができました。 – 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

することができますし、必要に応じてstringに出力[]byteに変換することができますコマンドをファイルに設定する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) 
} 
関連する問題