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

golang-os.stdout和multiwriter之间的区别,go,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

我要运行
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

根据@Time和@wldsvc的评论,是什么导致了
os.Stdout
multiwriter
之间的差异

问题的原因是
isatty
ls
用来选择默认输出格式,在这种情况下,使用
io.MultiWriter
os.Stdout
会根据
isatty
的结果做出不同的决定

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


(将答案记录为“在未回答列表中显示得很高”)

这是已知的、有效的行为。
ls
程序使用
isatty
C函数选择默认输出格式。当您使用
io.MultiWriter
时,
isatty
返回0,因此
ls
的输出格式是不同的。@TimCooper有什么简单的方法可以让go中的writer像tty一样工作吗?我在谷歌上搜索了一下,找到了pty,但并不知道它是如何工作的。@boh:为什么不换一种方式,强制
ls
使用所需的输出格式,而不管输出功能如何?试试
ls-x
ls-C
ls-1
@wldsvc
ls
是一些任意命令的示例
-C  list by columns
-x  list by lines instead of columns
-1  list one file per line