donglilian0061
donglilian0061
2015-10-31 14:32

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

已采纳

I have this code to run zsh and log its output to an output file.

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)
    }
}

when the program executes, typing ls will output

foo
bar

while if I let cmd.Stdout = os.Stdout, it displays correctly as

foo    bar

What leads to the differences between os.Stdout and multiwriter?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • douhan8610 douhan8610 6年前

    Based on comments by @Time and @wldsvc

    The cause of the problem is that isatty is used by ls to choose the default output format, in this case the use of io.MultiWriter and os.Stdout result in different decisions based on the result of isatty.

    The proposed solution was to force the output format of ls by use of the parameters (man ls):

    -C  list by columns
    -x  list by lines instead of columns
    -1  list one file per line
    

    (documenting answer as show quiet high on unanswered list)

    点赞 评论 复制链接分享

相关推荐