我有这个代码来运行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
之间存在差异的原因是什么?
答案 0 :(得分:2)
基于@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
(在未答复的名单上记录答案显示安静的高度)