2013-09-24 7 views
20

Próbuję uruchomić polecenie powłoki, przechwyć standardowe wyjście i zapisz dane wyjściowe do pliku. Jednak wydaje mi się, że brakuje kilku kroków, ponieważ plik, który próbuję napisać, jest pusty, gdy program istnieje. Jak mogę uchwycić standardowe wyjście polecenia i zapisać je w pliku?W golangu w jaki sposób mogę zapisać stdout pliku exec.Cmd do pliku?

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

Odpowiedz

12

Musisz opróżnić pisarz. Dodaj następujący:

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

Duh, wiedziałem, że czegoś mi brakuje. – jergason

32

Dzięki KirkMcDonald na kanale #go-nuts IRC Rozwiązałem to przez przypisanie pliku wyjściowego do cmd.Stdout, co oznacza, że ​​stdout pisze bezpośrednio do pliku. Wygląda to tak:

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

Można również użyć:

cmd.Stdout = os.Stdout 

który przekieruje wszystkie cmd wyjście do wyjścia standardowego systemu operacyjnego.

Powiązane problemy