我有这段代码可以运行 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.Stdout
和 multiwriter
之间的差异?
最佳答案
基于@Time 和@wldsvc 的评论
问题的原因是isatty
被ls
用来选择默认的输出格式,在本例中使用了io.MultiWriter
和 os.Stdout
根据 isatty
的结果做出不同的决定。
建议的解决方案是使用参数 (man ls) 强制 ls
的输出格式:
-C list by columns
-x list by lines instead of columns
-1 list one file per line
(将答案记录为在未回答列表中显示安静的高位)
关于golang - os.stdout 和 multiwriter 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33452726/