この最小限の例を考えると
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; )
出力してLINE 1
1秒後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
の出力が端末でない場合、出力をバッファリングしますが、これがまさにあなたが見ている動作の原因です。grep
GNUオプションを使用してこの機能を無効にすることができます--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
パイプラインでバッファリングをオフにするこのトピックについては、より多くの内容があります。