2013-09-24 9 views
20

Sto tentando di eseguire un comando shell, acquisire lo stdout e scrivere quell'output in un file. Tuttavia, mi sembra che manchi alcuni passaggi, poiché il file che sto cercando di scrivere è vuoto quando il programma esiste. Come posso catturare lo stdout del comando e scriverlo in un file?In golang come posso scrivere lo stdout di un exec.Cmd in un file?

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() 
} 

risposta

12

È necessario svuotare lo scrittore. Aggiungere il seguente:

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

Duh, sapevo che mi mancava qualcosa. – jergason

32

Grazie alla KirkMcDonald sul canale IRC #go-nuts, ho risolto questo assegnando il file di output per cmd.Stdout, il che significa che stdout scrive direttamente al file. Ecco come si presenta:

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

È anche possibile utilizzare:

cmd.Stdout = os.Stdout 

che reindirizzare tutto l'output cmd sullo standard output del sistema operativo'.

Problemi correlati