Golang 获取命令 tty 输出

Golang get command tty output

我正在使用 go 的 exec 运行 命令来获取命令输出,当命令 'Stdout' 字段设置为 os.Stdout 并且错误被发送到 os.Stderr.

我想将输出和错误输出显示到控制台,但我也希望我的程序看到输出是什么。

然后我制作了我自己的 Writer 类型,它就是这样做的,将两者写入缓冲区并打印到终端。

这就是问题所在 - 一些应用程序在检测到它没有写入 tty 时将其输出更改为人类可读性低得多的内容。因此,当我以后一种方式进行操作时,我得到的输出会变得很难看。 (计算机更干净,人类更丑陋)

我想知道 Go 中是否有某种方法可以说服我 运行 的任何命令我是一个 tty,尽管不是 os.Stdout/os.Stderr。我知道可以使用 script bash 命令,但是根据 Darwin/Linux 使用不同的标志,所以我试图避免这种情况。

提前致谢!

解决这个问题的唯一实用方法是分配一个 pseudo terminal (PTY) 并让您的外部进程将其用于其输出:因为 PTY 仍然是一个终端,检查它是否连接到真实终端的进程认为是的。

您可以从 this query 开始。

github.com/creack/pty可能是一个很好的起点。

下一步是让一个实现 PTY 的包实际分配它,并将 PTY 的 "the other end" 连接到您的自定义编写器。

(顺便说一下,编写自定义 "multi writer" 没有意义,因为存在 io.MultiWriter)。