trのバッファリングを無効にできますか


10

trLongRunningCommand|tr \\n ,LongRunningCommandからの数キロバイトの入力が蓄積された後にのみこのコマンドが出力の生成を開始するように、入力をバッファリングしているようです。

trこのバッファリング、またはバッファリングなしで改行を他の文字に置き換えることができる他のコマンドを強制的に停止する方法はありますか?


PS私はすでにパイプのバッファリングをオフにするからの最初の2つの提案を試しましたが、成功しませんでした。


1
stdbufLongRunningCommand、tr、またはその両方に異なる方法で適用しましたか?
meuh

このような両者にstdbuf -o0 fping -aAq -r2 -g 10.30.0.1 10.30.0.255 2>/dev/null | stdbuf -i0 tr \\n ,
ndemou

fping -q「プローブごとの結果を表示せず、最終的な要約のみを表示する」と言っているので、おそらく最後に長い書き込みは1つしかありませんか?
meuh

fpingコマンド自体は正常に機能しません。ただし、提案に感謝します
ndemou 2015年

2
私は、バッファリングの問題はに実際にあると考え出力tr。試してみてください|stdbuf -i0 -o0 tr ...
2015年

回答:


12

コマンドは通常、入力をバッファリングしません。それらはread()大きなチャンクに対してを実行しますが、パイプから読み取るときにパイプにそれほど多くのバイトがない場合、read()システムコールはそこにある文字数で戻り、アプリケーションは通常、それが可能であればそれで動作します。

それに注目すべき例外はあるmawk再続けるそのread()入力バッファがいっぱいになるまでINGを。

ただし、アプリケーションは出力(stdout)をバッファリングします。通常の動作では、出力がttyに送られる場合、バッファリングは行単位で行われます(つまり、出力する行が完全になるまで、またはブロックがいっぱいになるまで、標準出力への書き込みが開始されません)。長い行)、他のすべてのタイプのファイルの場合、バッファリングはブロック単位です(つまり、1ブロックが書き込まれるまで書き込みは開始されません(4KiB / 8KiBのようなもの...ソフトウェアとシステムによって異なります)。 ))。

したがって、あなたの場合、LongRunningCommandおそらくその出力はブロックによってバッファリングされ(その出力はttyではなくパイプであるため)、trその出力はおそらく端末であるため、おそらくラインごとにバッファリングされます。

ただし、出力からすべての改行文字を削除するため、行が出力されることはないため、バッファリングはブロック単位になります。

したがって、ここでは、LongRunningCommandとの両方のバッファリングを無効にしますtr。GNUまたはFreeBSDシステムの場合:

stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,

行をコンマで結合したい場合は、を使用するのがより良い方法であることに注意してくださいpaste -sd , -。これにより、出力は改行文字で終了します(おそらく、バッファリングを無効にする必要があります)。


@mikeserv。はい、そしてstdioバッファリングを使用し、setvbuf / setbuffer ...を単独で呼び出さず、シェル組み込みではありません。しかし、一般にGNUおよびFreeBSDシステムでは、これらの条件はすべて満たされています。
ステファンChazelas

ああ。数日前に、静的にコンパイルされたのI / Oストリームに影響を与えられないことにがっかりしたときに、自分自身を知っただけでしたsed。それが迷惑だったら申し訳ありません-しかし、私はそれが一般的な知識であることを知りませんでした。LD_PRELOADを使用していると思います。
mikeserv 2015年

ステファンがどうなるかを徹底的に説明していただきありがとうございます。高く評価されています
ndemou 2015年

5

改行をで置き換えるには","、次を実行します

awk '{ printf "%s,", $0 }'

GNU awk(gawk)とSolaris nawkは、出力が端末への場合、stdinで行バッファリングを行い、標準出力をバッファリングせずに実行します。mawkUbuntuで発生するawkがの場合、-W interactive同じバッファリング動作を実行するオプションを指定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.