在子壳或管道中使用我的 TUI 工具“窃取”了 stdout。如何延迟对管道的写入,以便我的 TUI 可以首先使用终端?

Using my TUI tool in a subshell or pipe "steals" the stdout. How can I delay a write to a pipe so that my TUI can use the terminal first?

提问人:sweet 提问时间:10/31/2023 更新时间:10/31/2023 访问量:29

问:

我正在从头开始用 Go 编写一个简单的 TUI,它将终端置于 Raw 模式(非规范模式)并关闭回显,然后它解释用户输入,绘制 TUI 并根据该输入显示图像。

我的问题是,当我构建二进制文件并在子壳或管链中运行它时,stdout 被管道和子壳吞噬,并且不显示任何内容。没有管道或子壳,它按预期运行。

预期行为:

我希望/期望该行为的行为类似于

x=$(fd | fzf)
printf "%s\n" "${x}"

在此示例中,fd(查找替代项)会吐出一个提供给 fzf 的文件列表,然后 fzf 在终端上正确显示其接口(尽管位于子壳或管道中),并将 x 分配给该输出。

如何延迟对管道/子 shell 的写入,直到我的 TUI 退出?或者我怎样才能防止管道/子壳“吃掉”stdout,以便我可以使用 /dev/tty 的 stdout,直到我准备好写入管道?

(请注意,我不是在谈论操作系统。管道,或 os/exec 包,我说的是与 Golang 中的终端 I/O 操作接口) 在这种情况下,我认为代码示例不是必需的,但是如果您必须了解我到底在做什么,那么我将把这些留在这里:https://github.com/sweetbbak/catnip/tree/main/go-catniphttps://github.com/sweetbbak/suwudo/blob/main/main.go

GO IO 管道 端子

评论

0赞 sweet 11/15/2023
答案是:使用 STDERR 渲染 TUI 而不是 Stdout。这就是 Fzf 和 Bubbletea 截至 2022 年所做的。我认为没有其他方法可以解决它,因为子壳/管道会吃掉 stdout。我以为你可以推迟该连接,直到需要,但我不确定。Stderr 是解决此 TUI 问题的简单解决方案

答: 暂无答案