追加読書

追加読書

私は(Rubyで)プログラムを書いていましたが、うまくいきます。数行のテキストを印刷してからしばらく停止してから繰り返します。

うまく動作しますが(Mac OS Xの端末で)、出力履歴を保持したい場合は、次のようにします。

ruby myscript.rb | tee record.txt

その後、出力が特定の量、おそらく数キロバイトに達するまで、出力は画面に表示されません。ただし、これは画面に5〜10分間何も表示されないことを意味します(CTRL-Cを押すとファイルには何も表示されません)。

出力をフラッシュするようにプログラムを変更することはできますが、アプリケーションはSTDOUTの出力がどの用途に使用されるのかを知ることはできません。もしそうなら、teeうまくいくようにすることは可能ですか(オプションがあるかもしれません)。それとも別のコマンドを使用できますか?それとも、BashまたはTerminalアプリケーションのオプションかもしれませんか?どのような方法がありますか?

ベストアンサー1

私はアプリケーションがSTDOUTの出力が何に使用されているのかわからないはずだと思います。

あなたは間違っていると思います。 CおよびC ++言語を含む複数のプログラミング言語のランタイムライブラリは、エンドデバイスへのストリーム接続が検出されたかどうかに応じてバッファリングを変更する意味を共有します。

多くの場合、これは言語を定義する部分です。 C言語標準は、例えば次のように言います。

標準エラーストリームは、最初に開いたときに完全にバッファリングされません。標準入力ストリームと標準出力ストリームは、標準入力ストリームと標準出力ストリームが対話型デバイスを参照していないと判断できる場合にのみ完全にバッファリングされます。

ストリームが端末装置に接続されていない場合、一般的な選択は、単位バッファリング、ラインバッファリング、またはフルバッファリングを選択することです。単位バッファリングとラインバッファリングは通常標準エラーに使用されます。標準出力は完全にバッファリングされます。しかし、これは言語によって異なります。

したがって、出力ストリームがこれらの言語のパイプである場合、出力が完全にバッファリングされないようにするには、次の手順を実行する必要があります。

  • プログラムを独自に作成して、標準出力をラインバッファリング、スマートバッファリング、またはバッファリングしないようにします。
  • stdbufコマンドなど、特定のプログラミング言語のランタイムライブラリにリンクしているものを使用してください。もしあなたのプログラミング言語はCであるか、Cランタイムライブラリ(I / Oストリーミング部分)に基づいています(一部のプログラミング言語はこれを行いません)。
  • ptybandageプログラムが標準出力を端末として考えるようにするのと同時に、その出力をパイプの書き込みの終わりに送信するなどのツールを使用します。

追加読書

おすすめ記事