将标准输出流写入文件 [英] Write stdout stream to file

查看:22
本文介绍了将标准输出流写入文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在通过exec.Command()运行外部进程,我希望实时打印命令的标准输出并将其写入文件(类似于从命令行使用tee)。

我可以用扫描仪和写入器实现这一点:

cmd := exec.Command("mycmd")
cmdStdOut, _ := cmd.StdoutPipe()

s := bufio.NewScanner(cmdStdOut)
f, _ := os.Create("stdout.log")
w := bufio.NewWriter(f)

go func() {
    for s.Scan(){
        t := s.Text()
        fmt.Println(t)
        fmt.Fprint(w, t)
        w.Flush()    
    }
}

有没有更常用的方法来避免ScanFlush

推荐答案

将多编写器分配给写入文件和管道的命令的标准输出。然后,您可以使用管道的读取端跟随输出。

此示例的行为类似于tee工具:

package main

import (
    "io"
    "os"
    "os/exec"
)

func main() {
    var f *os.File // e.g. os.Create, os.Open

    r, w := io.Pipe()
    defer w.Close()

    cmd := exec.Command("mycmd")
    cmd.Stdout = io.MultiWriter(w, f)

    // do something with the output while cmd is running by reading from r
    go io.Copy(os.Stdout, r) 

    cmd.Run()
}

替代标准管道:

package main

import (
    "io"
    "os"
    "os/exec"
)

func main() {
    var f *os.File

    cmd := exec.Command("date")
    stdout, _ := cmd.StdoutPipe()

    go io.Copy(io.MultiWriter(f, os.Stdout), stdout)

    cmd.Run()
}

这篇关于将标准输出流写入文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆