golang 的标准输出

61 天前
 jeesk
我想将 htop 封装到 exec.Command(). 然后继续将输出打印出来, 当我使用 stdout := cmd.StdoutPipe() 加上 bufio.NewScanner(stdout)的时候, 其实只能打印 htop 的一行。 有什么办法模拟 stdout 的输出?
1629 次点击
所在节点    Go 编程语言
7 条回复
Foralrec
61 天前
这段加上了么

```
var stdoutBuilder strings.Builder
for stdoutScanner.Scan() {
stdoutBuilder.WriteString(stdoutScanner.Text() + "\n")
}

```
securityCoding
61 天前
@Foralrec 🤣
jeesk
61 天前
不是, 最主要的是 stdoutScaner.Text() 是一行, 但是命令每次是覆盖输出。
我这里的 htop 命令只是举例。 大概是这样(下面是举例):
执行 htop 后: 下面的输出会不断刷新。
第一次输出:
hello world!
hello python!
hello java!
第二次输出:
hello china!
hello usa!
hello japan!

这种命令的输出只有 cmd.stdout = os.Stdout , 才能像命令行一样持续输出。 如果使用 stdoutScanner.Text() 这种每次只能得到一样, 根本不知道 hello japan! 的上下文是什么。 我无法获取到有用的信息。
jeesk
60 天前
此帖终结, 目前 golang 没有太好的办法。 目前采用的办法是修改调用软件的输出,重新编译源码。
zzhaolei
60 天前
为什么说 Go 没有太好的办法,想实现你说的不断刷新的效果,需要对历史的输出清屏。

我试了下,是可以实现刷新输出的。

https://go.dev/play/p/y6q_pWonwwp
julyclyde
60 天前
htop 是不是用的 tty 啊?
xi4oyu
59 天前
可以了解一下 pty ,和这个有关,不知道咋说明白

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1059153

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX