Reputation: 20184
I am trying to run a shell command, capture stdout and write that output to a file. However, I seem to be missing a few steps, as the file I am trying to write is empty when the program exists. How can I capture the stdout of the command and write that to a 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()
}
Upvotes: 35
Views: 45291
Reputation: 199
You can also use:
cmd.Stdout = os.Stdout
which will redirect all cmd output to the OS' standard output.
Upvotes: 19
Reputation: 20184
Thanks to KirkMcDonald on the #go-nuts
irc channel, I solved this by assigning the output file to cmd.Stdout
, which means that stdout writes directly to the file. It looks like this:
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()
}
Upvotes: 55
Reputation: 5347
You need to flush the writer. Add the following:
writer := bufio.NewWriter(outfile)
defer writer.Flush()
Upvotes: 17