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
@wldsvcls
是一些任意命令的示例
-C list by columns
-x list by lines instead of columns
-1 list one file per line