嗨根据这篇文章 , unbuffer
通过伪terminal(pty)连接到一个命令,这使得系统把它视为一个交互过程,因此不使用任何stdout缓冲。
我想在Windows上使用这个function。 我可以知道什么是相当于Windows上的非unbuffer
程序? 谢谢。
您所描述的行为是使用运行时库进行I / O的应用程序的典型特征。 默认情况下,大多数运行时库检查句柄是否是字符模式设备(如控制台),如果是,则不执行任何缓冲。 (理想情况下,运行时库将像处理控制台一样处理管道,但似乎大多数情况下不会)。
我不知道有什么明智的方法来欺骗这样的应用程序,使其认为它正在写入控制台,当它正在写入管道。
原则上,如果您知道需要多少数据,则可以使用控制台API函数为应用程序创建一个控制台来写入,然后从控制台读取输出。 但是你不能从Java那里做,你需要编写一个C应用程序来为你做。
类似地,原则上应该可能写出一个相当于Unix伪终端的设备驱动程序,一个像管道一样工作的设备驱动程序,但是会报告自己是字符模式设备。 但是,写设备驱动程序需要特定的专业知识,而且必须经过数字签名,所以除非现有产品存在,否则这种方法不太可行。
我花了一些时间,并成功。 我在研究期间发现了这个博客,并决定返回并提供我的解决方案,以便挽救下一个人。 我作为一个虚假的电子邮件客人回应,所以我不会互动,但不应该要求进一步的信息。
在7月18日12点在19:41哈里约翰斯顿写道:
“原则上,如果您知道需要多少数据,则可以使用控制台API函数为应用程序创建一个控制台,然后从控制台读取输出,但不能从Java那里完成,你需要写一个C程序来为你做。“
事情是,已经有一个这样做的实用程序。 它的写法稍有不同,但可以用来提供理想的结果。 它的目的是使一个Windows控制台应用程序与Linux风格的终端进行交互。 它通过运行隐藏的控制台并直接访问控制台缓冲区。 如果你试图使用它 – 你会失败。 我很幸运,发现这个实用程序有没有文档的开关,这将允许它提供简单的无缓冲输出。 如果没有这些开关,它会失败并显示错误 – 输出不是tty – 试图输出管道时。
这个工具叫做winpty。 你可以在这里得到它:
https://github.com/rprichard/winpty/releases
这里提到了无证开关:
https://github.com/rprichard/winpty/issues/103
我正在使用MSYS2版本。 你将需要msys-2.0.dll来使用它。
只需运行:
winpty.exe -Xallow-non-tty -Xplain your_program.exe | receive_unbuffered_output.exe
-Xallow-non-tty
,将允许管道输出
-Xplain
,将删除添加的Linux终端转义码(或任何他们被称为)
所需的文件是:
winpty.exe winpty-agent.exe winpty.dll msys-2.0.dll
winpty-debugserver.exe – 不需要