テールファイルではなくサブルーチンからのストリーム grep

テールファイルではなくサブルーチンからのストリーム grep

単純なファイルではなく、プログラムから連続出力を収集するための単純な1行コードはありますか?

PHPUnitたとえば、ここに含まれている行をスキップしたいと思います。明らかな理由から、次の点はこれを行いません。

phpunit tests/cases | grep -v --line-buffered "PHPUnit"

カスタム関数などを必要とせずに通常のオネライナで実行できますか?

答え1

phpunitコマンドの出力が(PHP、Bashシェルなどを介して)バッファリングされているように聞こえますgrep。出力をバッファリング解除して応答性を高める方法はいくつかあります。

バッファリング解除

試してみることができますunbufferコマンドは次の一部ですexpect

$ unbuffer phpunit tests/cases | grep -v --line-buffered "PHPUnit"

標準バッファ

stdbufコマンドを使用してバッファリングを無効にすることができます。

$ stdbuf -i0 -o0 -e0 phpunit tests/cases | grep -v --line-buffered "PHPUnit"

スイッチの詳細:

   -i, --input=MODE
          adjust standard input stream buffering

   -o, --output=MODE
          adjust standard output stream buffering

   -e, --error=MODE
          adjust standard error stream buffering

したがって、上記はSTDIN、STDOUT、およびSTDERRのバッファリングをゼロに設定します。

grep

Grep自体がバッファリングされた出力の原因である可能性があります。一度に1行の出力のみをバッファリングするように指示できます。 (既に言及しているか発見しましたが、このQ&Aを見ている視聴者がそこにもバッファリングがあることを理解できるように言及します。)

$ phpunit tests/cases | grep -v --line-buffered "PHPUnit"

関連情報