0

私が知っているように、たとえば「./program | grep someoutput」を実行すると、プログラムプロセスが終了した後にgrepさ​​れます。収入でどうやってそれを行うか知っていますか?

4

3 に答える 3

2

シェルは両方のプロセスを同時に生成し、最初の出力を 2 番目の入力に接続します。実行時間の長いプロセスが 2 つある場合は、プロセス テーブルに両方が表示されます。中間ステップはなく、最初のプログラムからのデータは保存されません。バケツではなくパイプです。

注 - バッファリングが含まれる場合があります。

于 2012-12-19T13:50:01.317 に答える
1

実際、パイプを介して渡されたデータはバッファリングされないため、grep は「リアルタイムで」使用できますtail -f /var/log/messages | grep something

予期した出力が得られない場合は、前のコマンドが出力をバッファリングしている可能性が高くなります。たとえば、二重の grep を考えてみましょう:

tail -f /var/log/messages | grep something | grep another

stdout が端末に接続されていない場合、grep はその出力をバッファリングするため、出力はすぐには表示されません。つまり、バッファがフラッシュされるまで、2 番目の grep はデータを認識しません。ライン バッファリング モードを強制すると、この問題が解決します。

tail -f /var/log/messages | grep --line-buffered something | grep another

バッファリングの方法によっては、 stdbufを使用してコマンドのバッファリング モードを変更できる場合があります。

stdbuf -oL ./program | grep something
于 2012-12-19T13:52:51.143 に答える
1

あなたが間違っている。

パイプはすぐにデータを受け取りますが、ソース プロセスによるパイプへの書き込みは、相手側 (シンク) が十分な速さでデータを読み取っていない場合、もちろんブロックされる可能性があります。

もちろん、これは必ずしもパイプが「ハードリアルタイム」の使用に適していることを意味するわけではありませんが、おそらくそれはあなたが意図したものではありません.

于 2012-12-19T13:49:58.800 に答える