猿问

Golang 获取命令 tty 输出

我使用 go 的 exec Run 命令来获取命令输出,当命令“Stdout”字段设置为os.Stdout且错误发送到os.Stderr.

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

然后我创建了自己的 Writer 类型来完成此操作,将两者写入缓冲区并打印到终端。

问题是,当某些应用程序检测到它没有写入 tty 时,会将其输出更改为人类难以读取的内容。因此,当我以后一种方式执行此操作时,我得到的输出会变得丑陋。(对计算机来说更干净,对人类来说更丑陋)

我想知道 Go 中是否有某种方法可以让我运行的任何命令相信我是 tty,尽管不是 tty os.Stdout/os.Stderr。我知道可以使用scriptbash 命令来完成,但是根据 Darwin/Linux 使用不同的标志,所以我试图避免这种情况。

提前致谢!


白猪掌柜的
浏览 210回答 1
1回答

狐的传说

解决此问题的唯一实用方法是分配一个伪终端 (PTY)并使外部进程将其用于其输出:由于 PTY 仍然是一个终端,因此检查它是否连接到真实终端的进程认为它是。您可以从这个查询开始。这github.com/creack/pty可能是一个很好的起点。下一步是让一个实现 PTY 的包实际分配它,并将 PTY 的“另一端”连接到您的自定义编写器。(顺便说一句,编写自定义的“多编写器”是没有意义的io.MultiWriter)。
随时随地看视频慕课网APP

相关分类

Go
我要回答