web-dev-qa-db-ja.com

シェルコマンドの出力をバッファーなしにするにはどうすればよいですか?

出力バッファリングなしでシェルコマンドを実行する方法はありますか?

例えば、 hexdump file | ./my_scriptは、入力を16進ダンプからmy_scriptにバッファされたチャンクでのみ渡し、行ごとには渡しません。

実際、コマンドをバッファリングしないようにする一般的な解決策を知りたいですか?

59
bodacydo

私の知る限り、あなたはいハックなしでそれを行うことはできません。パイプへの書き込み(またはパイプからの読み取り)は自動的に完全なバッファリングをオンにし、それに対してできることは何もありません: 。「ラインバッファリング」(必要なもの)は、ターミナルの読み取り/書き込み時にのみ使用されます。いハックはこれを正確に行います:プログラムを擬似端末に接続し、パイプ内の他のツールがラインバッファリングモードでその端末から読み書きできるようにします。

ページにはいくつかの提案(前述の「ugいハック」)もあります。つまり、unbufferを使用するか、LD_PRELOADでいくつかのトリックを引き出します。

19

GNU coreutils、したがって事実上すべてのLinuxディストリビューションに含まれるstdbufを試してください。これにより、入力、出力、エラーのバッファー長がゼロに設定されます。

stdbuf -i0 -o0 -e0 command
116
jpatokal

unbufferパッケージのexpectコマンドは、出力バッファリングを無効にします。
buntu Manpage:unbuffer-unbuffer output

使用例:

unbuffer hexdump file | ./my_script

scriptコマンドを使用して、hexdumpの出力を行バッファリングすることもできます(hexdumpは、擬似端末で実行され、hexdumpをだまして考えますパイプではなく端末に標準出力を書き込みます)。

# cf. http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe/
stty -echo -onlcr
script -q /dev/null hexdump file | ./my_script         # FreeBSD, Mac OS X
script -q -c "hexdump file" /dev/null | ./my_script    # Linux
stty echo onlcr
18
vroc