標準出力をファイルなどにリダイレクトすると、その出力はプログラム自身によってバッファリングされ、改行するまでリダイレクト先に出力されないことが多い。
これは expect のようなオートパイロットプログラムでは都合が悪い。ユーザに入力を促すプロンプトなどは改行を出力せず、そのままバッファにためこんでしまうのだ。オートパイロットプログラムはそれを検出できない。
Linux の expect などは、これをどうやって回避しているかというと、プログラム側にリダイレクトしていることを悟られないよう、リダイレクト先を端末のように見せかけているという。その機能のことを unbuffer というらしい。
で、Windows には unbuffer の機能が「最近まで」なかった。
ところが
Addendum: seven years later, Windows finally supports pseudoconsoles. If you are running on Windows 10 v1809 or later, this new API should solve your problem
追記:7年越しに、Windows もついに疑似コンソールをサポートした。Windows10 v1809 移行であれば、新API が解決する
どうやら unbuffer、なんとかいけそうな雰囲気である。そのための疑似端末の API も用意されているようだ。
そのうち、ちゃんと格闘して、自作の Expect-Lua の v2 あたりで使えるようにしたいものだ。
Expect-Lua では監視するプロセスはリダイレクトさせず、コンソールのカーソル行付近を定期的に監視して、expect のような動作を擬似的に実行している。だが、この方式だと、あまりに被監視プログラムの出力が多すぎる時、見逃してしまうのだよね。
References
- https://mstdn.jp/@zetamatta/111561762517903045
.. 本記事の元ネタの投稿 - what's the principle of this project? · Issue #34 · hymkor/expect
.. Expect-Lua について動作原理について質問をいただいた - windows package - golang.org/x/sys/windows - Go Packages
.. CreatePseudoConsole は既に golang.org/x/sys で登録されていた。 - qsocket/conpty-go: Windows Pseudo Console (ConPTY) implementation for Golang.
.. GitHub に Pseudo console を用いるライブラリが登録されていた - Creating a Pseudoconsole session - Windows Console | Microsoft Learn
- x/sys/windows: ProcThreadAttributeListContainer not working with Windows pseudo console · Issue #50134 · golang/go