標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

(調査メモ) Windows で unbuffer

標準出力をファイルなどにリダイレクトすると、その出力はプログラム自身によってバッファリングされ、改行するまでリダイレクト先に出力されないことが多い。

これは 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