获取使用curses的命令的输出

获取使用curses的命令的输出

如果我尝试将 python 程序的输出(stdout)放入变量中,我会这样做:

set zpath (python something.py "$argv")

但如果程序产生了一个curses界面,它就不会显示。

程序暂时显示一个curses界面来选择一些东西,在程序结束之前退出curses。它向标准输出打印一些有用的数据。

我读到我可以添加2>&1 >/dev/tty到命令的末尾。

这确实使curses 界面显示,但输出未保存到变量中。

如果我打印一些东西来测试,它只会将其打印到 shell 而不是变量中。

如何使curses 接口工作,同时使stdout 捕获工作?

我特别寻找一个简单的解决方案,因为到 /dev/tty 的重定向看起来很混乱,

我需要让它适用于不同的外壳。

答案1

我读到我可以将 2>&1 >/dev/tty 添加到命令末尾。

这会将 stdout 重定向到终端(并将 stderr 重定向到 stdout 最初所在的位置 - 命令替换缓冲区)。

如果显示了界面,并且在没有重定向的情况下运行它却没有显示界面,则意味着程序使用 stdout 来显示它。

这意味着,如果

它向标准输出打印一些有用的数据。

该输出也将最终到达终端。

恐怕程序想在标准输出上使用 tty 来显示其界面然后将有用的输出打印到同一个文件描述符、stdout,那么你就不能分别重定向这两件事。外壳无法将它们分开,因为它们不是分开的。

您需要做的就是修改程序,以便它在一个文件(如 /dev/tty)上显示其界面,并将有用的输出打印到另一个文件(如 stdout)。

这也是如何弗兹夫,它会打开一个交互式终端界面并将某些内容打印到标准输出,在 unix 上运行时会打开 /dev/tty - 请参阅https://github.com/junegunn/fzf/blob/ef67a45702c01ff93e0ea99a51594c8160f66cc1/src/tui/light_unix.go#L50-L63https://github.com/junegunn/fzf/blob/b3ab6311c587e18ee202c5205afc658a33f2a23c/src/tui/light.go#L29

或者它可以将显示放在 stdout 上并在 stderr 上打印有用的信息 - 这将使该2>&1 >/dev/tty技巧发挥作用。


边注:

设置 zpath (python Something.py "$argv")

在鱼中,你很可能会这样做不是想要引用这一点$argv- 如果它设置为多个参数,那么您现在已经将它们压缩在一起成为无意义的东西。它也不会帮助处理例如空格,因为 Fish 不像 bash 那样执行分词。一旦将变量设置为 X 元素,将其扩展到引号之外就会将其扩展到那些 X 元素,而无需再次将它们分开。

相关内容