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

boh*_*boh 7 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

foo
bar
Run Code Online (Sandbox Code Playgroud)

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

foo    bar
Run Code Online (Sandbox Code Playgroud)

是什么导致os.Stdout和之间的差异multiwriter

mil*_*onb 3

基于@Time 和@wldsvc 的评论

问题的原因是isatty使用 来ls选择默认输出格式,在本例中,使用io.MultiWriteros.Stdout会根据 的结果做出不同的决定isatty

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

-C  list by columns
-x  list by lines instead of columns
-1  list one file per line
Run Code Online (Sandbox Code Playgroud)

(将答案记录为在未答复列表中显示安静的高位)