4

以下のコマンドをbashで実行すると、プログラムが終了するまで待機してから、すべての出力をフラッシュします。パイプを削除すると、各行がすぐに出力されます。

{ for i in `seq 3` ; do echo $i ; sleep 1 ; done ; } \
    | perl -p -e 's,(.*ERROR.*),\e[01;31m\1\e[00m,g' \
    | perl -p -e 's,(.*WARNING.*),\e[01;33m\1\e[00m,g' \
    | perl -p -e 's,(.*TCPEchoTest.*),\e[01;30m\1\e[00m,g' \
    | perl -p -e 's,(.*enters.*),\e[00;33m\1\e[00m,g'

パイプを使用して各行をすぐに印刷するにはどうすればよいですか?

4

4 に答える 4

6

パイプには通常、プログラムの実行が終了するまで出力を保持できるデフォルトの 4kB バッファーがあります。

stdbufテキストがすぐに出力されるように、ユーティリティを使用してこのバッファを無効にしてみてください。

stdbuf -i0 -o0 -e0 command | perl ...

以下も参照してください。

パイプのバッファリングをオフにする

于 2013-05-29T20:49:56.373 に答える
4

perl はバッファリングを行っているため、これをオフにするには perl コマンドを変更する必要があります。次のように、各 perl コマンドで変数を設定し$|ます。

{ for i in `seq 3` ; do echo $i ; sleep 1 ; done ; } \
    | perl -p -e 'BEGIN{$|=1}s,(.*ERROR.*),\e[01;31m\1\e[00m,g' \
    | perl -p -e 'BEGIN{$|=1}s,(.*WARNING.*),\e[01;33m\1\e[00m,g' \
    | perl -p -e 'BEGIN{$|=1}s,(.*TCPEchoTest.*),\e[01;30m\1\e[00m,g' \
    | perl -p -e 'BEGIN{$|=1}s,(.*enters.*),\e[00;33m\1\e[00m,g'

ブロックは、BEGIN各行が で読み取られた後に代入を行うのではなく、入力を読み取る前に一度代入を行い-pます。

于 2013-05-29T20:56:55.943 に答える