1. ホーム
  2. unix

[解決済み] パイプラインでstdoutを強制的にラインバッファリングする

2022-05-03 05:02:25

質問

通常は stdout はラインバッファリングされます。言い換えれば printf の引数が改行で終わっていれば、その行は即座に印刷されます。このことは、パイプを使って tee .

C++のプログラムを持っています。 a 文字列を出力するもので、常に \n -に、終端を stdout .

単体で実行される場合( ./a ) 、すべてが正しく、期待通りのタイミングでプリントされます。しかし、もしこれをパイプで tee ( ./a | tee output.txt を使うと、終了するまで何も表示されません。 tee .

を追加すれば直るのは分かっている。 fflush(stdout) C++プログラムの各印刷操作の後に。しかし、もっときれいで簡単な方法はないでしょうか?例えば、以下のようなコマンドを実行すれば、強制的に stdout は、パイプを使用している場合でもラインバッファリングされるのでしょうか?

解決方法は?

試す unbuffer の一部である expect パッケージで提供されます。すでにお持ちの方もいらっしゃるかもしれません。

あなたの場合、このように使うことになります。

./a | unbuffer -p tee output.txt

( -p はパイプラインモード用で、unbuffer が標準入力から読み込んで、残りの引数でコマンドに渡します)