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

时间:2015-10-31 14:32:40

标签: go

我有这个代码来运行zsh并将其输出记录到输出文件。

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

程序执行时,输入ls将输出

foo
bar

如果我让cmd.Stdout = os.Stdout,它会正确显示为

foo    bar

导致os.Stdoutmultiwriter之间存在差异的原因是什么?

1 个答案:

答案 0 :(得分:2)

基于@Time和@wldsvc的评论

问题的原因是isatty使用ls来选择默认输出格式,在这种情况下,使用io.MultiWriteros.Stdout导致不同决定基于isatty

的结果

建议的解决方案是使用参数(man ls)强制ls的输出格式:

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

(在未答复的名单上记录答案显示安静的高度)