出力バッファリングなしでシェルコマンドを実行する方法はありますか?
たとえば、hexdump file | ./my_script
行ごとではなく、バッファされたチャンクでhexdumpからmy_scriptへの入力のみを渡します。
実際、コマンドをバッファリング解除する方法の一般的な解決策を知りたいですか?
パッケージのコマンドunbuffer
は、出力バッファリングを無効にします: Ubuntu Manpage: unbuffer - unbuffer outputexpect
使用例:
unbuffer hexdump file | ./my_script
AFAIK、醜いハックなしでそれを行うことはできません。パイプへの書き込み(またはパイプからの読み取り)は自動的にフルバッファリングをオンにし、それについては何もできません:-(。「ラインバッファリング」(これは必要なものです)は、端末の読み取り/書き込み時にのみ使用されます。醜いハックはまさにこれを行います:プログラムを疑似端末に接続し、パイプ内の他のツールがラインバッファリングモードでその端末から読み取り/書き込みを行うようにします。問題全体をここで説明します。
このページには、何をすべきか、つまり、を使用しunbuffer
たり、いくつかのトリックを引っ張ったりするためのいくつかの提案(前述の「醜いハック」)もありLD_PRELOAD
ます。
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
これを解決するには、grep または egrep の「--line-buffered」オプションを使用する必要があります。他のツールは必要ありません。