標準愚痴出力

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

Windows でコマンドの標準出力・標準エラー出力をぜんぶ記録する話

コマンドの標準出力・エラー出力は、過去 Expect-Lua for Windows を実装した時に一度検討したことがありました。

普通に標準出力に吐かれるデータをパイプラインで受信すると、改行コードが出力されるまで出力がバッファリングされて動作が止まってしまいます。すると、プロンプトを出して入力待ちをするようなコマンドはハングアップしてしまうという問題がありました。

そうならないためには、パイプラインではなく、OSの疑似端末機能が必要となります。古い Windows にはそういうものはなかったので、かわりに Expect-Lua では画面バッファに直接アクセスして、カーソル行を定期的に監視するようにしていました。

ですが、WSL(Windows SubSystem for Linux)などで Linux 同様のコンソール制御ができるようにするためか、Windows 10 でも疑似端末が使えるようになったようです。

これを Go から利用するパッケージとしては、当初

がありました。ですが、これは1-疑似端末に対して、1-外部コマンドを起動できるだけなので、複数のコマンドを起動する場合、Expect などではちょっと使いづらく、見送らざるをえませんでした。

その後、nyagos で上記の discussion が立てられた後、改めて検索してみたところ、次のようなパッケージも公開されていました。

こっちは一つの疑似端末インスタンスから複数の外部コマンドが起動できるようになっています。これは使えそうです。で、今回、試しに端末出力を記録するコマンド scriptWindows 版を書いてみました1

ほとんどの機能は go-pty に丸投げで必要最小限しか実装していないのですが、意外とちゃんと機能してる感じです。ただし、直接コンソールの機能をコールしているテキストエディターなどを起動すると画面が乱れたりしますが、さすがにそれは仕方ないかなと。

まぁ、興味ある方はいっぺん使ってみてくださいませ


  1. まぁ、これも結果的に1-疑似端末に対して、1-コマンドしか起動させていないのですが…