出力バッファリングなしでシェルコマンドを実行する方法はありますか?
例えば、 hexdump file | ./my_script
は、入力を16進ダンプからmy_scriptにバッファされたチャンクでのみ渡し、行ごとには渡しません。
実際、コマンドをバッファリングしないようにする一般的な解決策を知りたいですか?
私の知る限り、あなたはいハックなしでそれを行うことはできません。パイプへの書き込み(またはパイプからの読み取り)は自動的に完全なバッファリングをオンにし、それに対してできることは何もありません: 。「ラインバッファリング」(必要なもの)は、ターミナルの読み取り/書き込み時にのみ使用されます。いハックはこれを正確に行います:プログラムを擬似端末に接続し、パイプ内の他のツールがラインバッファリングモードでその端末から読み書きできるようにします。
ページにはいくつかの提案(前述の「ugいハック」)もあります。つまり、unbuffer
を使用するか、LD_PRELOAD
でいくつかのトリックを引き出します。
GNU coreutils、したがって事実上すべてのLinuxディストリビューションに含まれるstdbuf
を試してください。これにより、入力、出力、エラーのバッファー長がゼロに設定されます。
stdbuf -i0 -o0 -e0 command
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