dongyuruan2957 2018-01-18 17:21
浏览 63
已采纳

如何将os.Exec中的stdout传送到文件和终端?

How to pipe stdout for os.Exec to file but also to terminal?

I've try this:

go func() {
    scanner := bufio.NewScanner(stdout)
    writer := bufio.NewWriter(logFile)
    for scanner.Scan() {
        log.Debugln(scanner.Text())
        writer.WriteString(scanner.Text())
    }
    writer.Flush()
}()

But writer.WriteString(scanner.Text()) losts in file. How to got them back? Maybe there is some more elegant solution with pipes?

  • 写回答

1条回答 默认 最新

  • dqoqnmb163241 2018-01-18 17:28
    关注

    Create a io.MultiWriter with arguments os.Stdout and the file. Set Cmd.Stdout to the multiwriter. Run the command.

     cmd := exec.Command(name, args...)
     cmd.Stdout = io.MultiWriter(os.Stdout, file)
     err := cmd.Run()
    

    If you want to write line by line to log.Debugf and other files, then do the following:

    go func() {
        scanner := bufio.NewScanner(stdout)
        writer := bufio.NewWriter(io.MultiWriter(os.Stdout, file))
        for scanner.Scan() {
            log.Debugln(scanner.Text())
            writer.Write(scanner.Bytes())
            writer.WriteByte('
    ')  // add line separator
        }
        writer.Flush()
    }()
    

    This code assumes that the line separator in the input is .

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 根据以下文字信息,做EA模型图
  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥60 关机时蓝屏并显示KMODE_EXCEPTION_NOT_HANDLED,怎么修?
  • ¥66 如何制作支付宝扫码跳转到发红包界面