Подтвердить что ты не робот

В golang, как я могу записать stdout файла exec.Cmd в файл?

Я пытаюсь запустить команду оболочки, захватить stdout и записать этот вывод в файл. Однако, кажется, я пропустил несколько шагов, так как файл, который я пытаюсь записать, пуст, когда программа существует. Как я могу захватить 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()
}
4b9b3361

Ответ 1

Вам нужно очистить писателя. Добавьте следующее:

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

Ответ 2

Благодаря KirkMcDonald на канале #go-nuts irc, я решил это, назначив выходной файл cmd.Stdout, что означает, что 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()
}

Ответ 3

Вы также можете использовать:

cmd.Stdout = os.Stdout

который перенаправляет весь вывод cmd на стандартный вывод ОС.