donglilian0061 2015-10-31 14:32
浏览 605
已采纳

golang-os.stdout和multiwriter之间的区别

I have this code to run zsh and log its output to an output file.

package main

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

func main() {

    cmd := exec.Command("zsh")
    f, _ := os.Create("log.txt")
    multiWriter := io.MultiWriter(os.Stdout, f)
    cmd.Stdout = multiWriter
    cmd.Stderr = os.Stderr
    cmd.Stdin = os.Stdin
    cmd.Run()
}    
func haltOnError(err error) {
    if err != nil {
        panic(err)
    }
}

when the program executes, typing ls will output

foo
bar

while if I let cmd.Stdout = os.Stdout, it displays correctly as

foo    bar

What leads to the differences between os.Stdout and multiwriter?

  • 写回答

1条回答 默认 最新

  • douhan8610 2015-11-17 22:37
    关注

    Based on comments by @Time and @wldsvc

    The cause of the problem is that isatty is used by ls to choose the default output format, in this case the use of io.MultiWriter and os.Stdout result in different decisions based on the result of isatty.

    The proposed solution was to force the output format of ls by use of the parameters (man ls):

    -C  list by columns
    -x  list by lines instead of columns
    -1  list one file per line
    

    (documenting answer as show quiet high on unanswered list)

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

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料