file - 将标准输出流写入文件

标签 file go stream stdout

我正在通过 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()
}

StdoutPipe 的替代方案:

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

关于file - 将标准输出流写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48926982/

相关文章:

c# - 检查文件是否正在使用 - 附加问题

go - IntelliJ Golang 插件无法导入默认包

go - 从golang中的单词结尾删除句号

go - go语言解析嵌套JSON

c# stream wcf上传文件

android - 打开 PPT 文件

java - 如何用Java编写文件列表

javascript - 组合流 Node

c++ - 在 C++ 高效存储上,刷新文件策略

python:为什么这不在新行上写入文件?