2013-09-24 60 views
20

我想運行一個shell命令,捕獲stdout並將該輸出寫入文件。但是,我似乎錯過了幾個步驟,因爲當程序存在時,我試圖寫入的文件是空的。如何捕獲命令的stdout並將其寫入文件?在golang中,我該如何將exec.Cmd的stdout寫入文件?

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

您需要刷新作者。添加以下內容:

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

杜,我知道我錯過了一些東西。 – jergason

32

由於KirkMcDonald上#go-nuts IRC頻道,我解決了這個由指定輸出文件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」標準輸出。

相關問題