2013-09-24 11 views
20

シェルコマンドを実行してstdoutをキャプチャし、その出力をファイルに書き込もうとしています。しかし、プログラムが存在するときに、私が書き込もうとしているファイルが空であるため、いくつかのステップが欠落しているようです。コマンドの標準出力をキャプチャしてファイルに書き込むにはどうすればよいですか?golangでexec.Cmdの標準出力をファイルに書き込むにはどうしたらいいですか?

package main 

import (
    "bufio" 
    "io" 
    "os" 
    "os/exec" 
) 

func main() { 

    cmd := exec.Command("echo", "'WHAT THE HECK IS UP'") 

    // open the out file for writing 
    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) 

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

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

答えて

12

ライターをフラッシュする必要があります。次の行を追加します。#go-nuts IRCチャンネルでKirkMcDonaldへ

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

私は何かが欠けていることを知っていました。 – jergason

32

おかげで、私はstdoutがファイルに直接書き込みを行うことを意味し、cmd.Stdoutに出力ファイルを割り当てることによって、これを解決しました。それは次のようになります。

package main 

import (
    "os" 
    "os/exec" 
) 

func main() { 

    cmd := exec.Command("echo", "'WHAT THE HECK IS UP'") 

    // open the out file for writing 
    outfile, err := os.Create("./out.txt") 
    if err != nil { 
     panic(err) 
    } 
    defer outfile.Close() 
    cmd.Stdout = outfile 

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

はまた、使用することができます。

cmd.Stdout = os.Stdout 

OSの標準出力へのすべてのcmdの出力をリダイレクトしますました。

関連する問題