簡単な説明

簡単な説明

この最小限の例を考えると

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; )

出力してLINE 11秒後LINE 2予想通り


パイプで接続するとgrep LINE

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE

動作は前の場合と同じです。予想通り


またはパイプで接続するとcat

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | cat

行動はまた同じで、予想通り


しかし、、 でパイプしgrep LINEてから にパイプするとcat

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE | cat

1秒が経過するまで出力がなく、両方の行が出力にすぐに表示されます。期待しない


なぜこれが起こるのですか?最後のバージョンが最初の3つのコマンドと同じように機能するようにするにはどうすればよいですか?

ベストアンサー1

(少なくともGNU)grepの出力が端末でない場合、出力をバッファリングしますが、これがまさにあなたが見ている動作の原因です。grepGNUオプションを使用してこの機能を無効にすることができます--line-buffered

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep --line-buffered LINE | cat

またはstdbufユーティリティ:

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | stdbuf -oL grep LINE | cat

パイプラインでバッファリングをオフにするこのトピックについては、より多くの内容があります。

おすすめ記事