【问题标题】:In golang how can I write the stdout of an exec.Cmd to a file?在 golang 中,如何将 exec.Cmd 的标准输出写入文件?
【发布时间】:2013-09-24 16:20:43
【问题描述】:

我正在尝试运行 shell 命令,捕获标准输出并将该输出写入文件。但是,我似乎缺少一些步骤,因为当程序存在时,我尝试写入的文件是空的。如何捕获命令的标准输出并将其写入文件?

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

【问题讨论】:

    标签: file-io go


    【解决方案1】:

    你也可以使用:

    cmd.Stdout = os.Stdout
    

    这会将所有 cmd 输出重定向到操作系统的标准输出。

    【讨论】:

    • “操作系统的标准输出”实际上是父进程'stdout 而不是“操作系统”。此外,默认情况下,即如果程序对cmd.Stdoutcmd.Stderr 不执行任何操作,则子进程'stdoutstderr 转到父进程'stdoutstderr
    【解决方案2】:

    您需要刷新写入器。添加以下内容:

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

    【讨论】:

    • 呃,我知道我错过了什么。
    【解决方案3】:

    感谢#go-nuts irc 频道上的 KirkMcDonald,我通过将输出文件分配给 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()
    }
    

    【讨论】:

    • 这真是太好了。如果您使用cmd.Run(),则无需在末尾发出cmd.Wait(),因为Run 正在阻塞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2012-06-01
    • 2018-09-09
    相关资源
    最近更新 更多