À golang, Comment puis-je écrire le stdout d'un exec.Cmd à un fichier?

j'essaie d'exécuter une commande shell, de capturer stdout et d'écrire cette sortie dans un fichier. Cependant, il me semble que je manque quelques étapes, car le fichier que j'essaie d'écrire est vide lorsque le programme existe. Comment puis-je capturer le stdout de la commande et l'écrire dans un fichier?

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()
}
21
demandé sur Tshepang 2013-09-24 20:20:43

3 réponses

Vous devez rincer à l'écrivain. Ajoutez la ligne suivante:

    writer := bufio.NewWriter(outfile)
    defer writer.Flush()
13
répondu Kluyg 2013-09-24 16:27:24

merci à KirkMcDonald sur le #go-nuts canal irc, j'ai résolu cela en assignant le fichier de sortie à cmd.Stdout, ce qui signifie que stdout écrit directement dans le fichier. Il ressemble à ceci:

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()
}
33
répondu jergason 2013-09-24 16:30:00

Vous pouvez aussi utiliser:

cmd.Stdout = os.Stdout

qui redirigera toute la sortie cmd vers la sortie standard du système D'exploitation.

9
répondu cjhutchi 2015-03-07 19:04:10