GNU/Linux >> Linux の 問題 >  >> Linux

Teeコマンドでプログラムを機能させる方法は?

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

(Mac OS Xの端末では)うまく機能しますが、出力の記録を残したい場合は、

を使用して注意しました。
ruby myscript.rb | tee record.txt

その後、出力が特定の量、おそらく数kbに達するまで、出力は画面に表示されません。ただし、これは、画面に何も表示されない状態で5分または10分を意味する可能性があります(CTRL-Cを押してもファイルには何も表示されません)。

プログラムを変更して出力をフラッシュすることもできますが、STDOUTへの出力で何が使用されているかについてはアプリに依存しないようにする必要があると思いました。したがって、tee うまく機能するように(おそらくオプションを使用して)作成するか、他のコマンドを使用できますか、それともBashまたはターミナルアプリのオプションですか?方法はありますか?

承認された回答:

アプリは、STDOUTへの出力で何が使用されているかを認識しないようにする必要があると思いました。

あなたは間違って考えました。 CおよびC++言語を含むいくつかのプログラミング言語のランタイムライブラリはすべて、ストリームが端末デバイスに接続されていることを検出したかどうかに応じて、バッファリングを変更するセマンティクスを共有しています。

多くの場合、これは言語の定義された部分です。 C言語標準では、たとえば次のように述べています。

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

ストリームが端末デバイスに接続されていない場合の通常の選択は、ユニットバッファリング、ラインバッファリング、またはフルバッファリングを選択することです。標準エラーでは、ユニットバッファリングとラインバッファリングが通常です。標準出力用のフルバッファリング。ただし、これは言語によって異なります。

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

  • プログラムをそれ自体に記述して、標準の出力行をバッファリング、スマートバッファリング、またはバッファリング解除します。
  • stdbufなど、特定のプログラミング言語のランタイムライブラリをフックするものを使用します コマンドif プログラミング言語はCであるか、Cランタイムライブラリをベースとして使用します(一部のプログラミング言語では使用しません)。または
  • ptybandageなどのツールを使用する これにより、プログラムは標準出力が端末であると見なし、その出力を取得してパイプの書き込み端に送信します。
関連:プログラムは、カラー出力を使用するかどうかをどのように決定しますか?

さらに読む

  • https://unix.stackexchange.com/a/249801/5132

Linux
  1. Iconvに入力ファイルを変換された出力に置き換える方法は?

  2. Bashスクリプトでは、Continueコマンドは埋め込みループでどのように機能しますか?

  3. UnixターミナルでExitコマンドはどのように機能しますか?

  1. ティーコマンドはどのように機能しますか?

  2. 出力をファイルに追加する方法は?

  3. tr コマンドの「-s」、「-t」、および「-c」オプションは Unix でどのように機能しますか?

  1. findコマンドを使用して権限を監査する方法

  2. Linuxスクリプトコマンドを使用してターミナルセッションをキャプチャして出力する方法

  3. ps コマンドはどのように機能しますか?