tr
LongRunningCommand|tr \\n ,
LongRunningCommandの入力が数キロバイトを蓄積した後にのみ、コマンドが出力の生成を開始するように入力をバッファリングしているようです。
tr
バッファリングなしで改行を別の文字に置き換えることができるこのバッファリングまたは他のコマンドを強制的に停止する方法はありますか?
PS:最初の2つの提案を試しましたパイプラインでバッファリングをオフにする成功しませんでした。
答え1
コマンドは通常、入力をバッファリングしません。チャンクに対してアクションを実行しますread()
が、パイプから読み取るときにパイプにバイトが多くない場合、read()
システムコールはできるだけ多くの文字を返し、アプリケーションは通常可能であればそれを使用します。
1つの注目すべき例外は、入力バッファがいっぱいになるまでmawk
続くことです。read()
アプリケーションはバッファリングを実行します。出力(Stdout)しかし。一般的な動作は、出力がttyに対するものである場合、バッファリングが1行ずつ実行されることです(つまり、出力するライン全体があるまで、または非常に難しい場合はstdoutへの書き込みを開始しません)。大きなチャンク全体)長い行)、他のすべてのファイル形式では、バッファリングはブロック単位で行われます(つまり、書き込み可能なブロックがある場合にのみ書き込みが開始されます(たとえば、4KiB / 8KiB ...ソフトウェアとシステムによって異なります)。 )). )。
したがって、あなたの場合、LongRunningCommand
出力はブロック単位でバッファリングされ(出力はttyではなくパイプであるため)、出力は端末になる可能性があるため、ライン単位でバッファリングされる可能性がtr
あります。
ただし、出力からすべての改行文字を削除するため、1行も出力されないため、バッファリングはチャンクで発生します。
LongRunningCommand
したがって、ここではとのバッファリングを無効にしたいと思いますtr
。 GNUまたはFreeBSDシステムの場合:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
行をコンマで連結するには、を使用することをお勧めしますpaste -sd , -
。これにより、出力は改行で終了します(まだバッファリングを無効にする必要があるかもしれません)。
答え2
改行文字をに置き換えるには","
:
awk '{ printf "%s,", $0 }'
端末に出力すると、GNU awk(gawk
)とSolarisはstdinでラインバッファリングとして実行され、stdoutをバッファリングしません。 Ubuntuで発生するnawk
awkの場合は、同じバッファリング動作を得るためのオプションを提供できます。mawk
-W interactive