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

标签 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 之间的差异?

最佳答案

基于@Time 和@wldsvc 的评论

问题的原因是isattyls用来选择默认的输出格式,在本例中使用了io.MultiWriteros.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/

相关文章:

go - 有效地将一个 slice 插入另一个 slice

go - 在 sync.Map 中加载或存储而无需每次都创建新结构

maven - 如何使用 maven 构建 GO 可执行文件

go - Kubernetes `client-go`-如何在容器中获取容器状态

google-app-engine - 如何将 -ldflags 传递给 GAE 构建?

go - bufio.NewReader.ReadString() 中没有缓冲区大小限制?

go - append() 实现在哪里?

go - Go 中的 undefined variable

go - Golang-为什么总是ItoA在返回字符串时删除初始0

google-app-engine - golang 数据存储投影查询从填充实体返回空字符串