stdoutバッファリングを削除するための「unbuffer」または「stdbuf」


13

unbuffer(1)とstdbuf(1)に違いはありますか?私が収集したものから、unbufferは、最初にlibc関数set(X)bufを呼び出してから物事をさせる「ベストエフォート」以上のものを作成しますか?

回答:


14

それらはまったく異なる方法で動作します。

プログラムunbufferは、expectedを使用して、指定されたコマンドを実行します。expectは子プロセスのstdoutにアタッチする擬似ttyを作成するため、子はブロックバッファリングの代わりにラインバッファリングを使用するべきだと考えることにだまされる可能性があります。一部のプログラムはisatty(stdout)がtrueの場合に動作を変更しますが、他のプログラムはそうではなく、どちらがそうでどちらがそうでないかを知るのは非常に困難です。

プログラムstdbufは、動的にロードされたバイナリのlibcの前にlibstdbufを配置しようとします。libstdbufは、libc stdio呼び出しのデフォルトのバッファリング戦略を再定義します。

私はこれを見つけました

 apt-get source expect coreutils

各プログラムの関連ソースを読む。


いくつかの心配なもの(マンページから):unbuffer -p入力をバッファリング解除するプロセスが終了すると、正しく動作しないように見える場合があります。考慮:process1 | unbuffer -p process2 | process3process1が終了した場合、process2はまだ終了していない可能性があります。unbufferが長く待つことを知ることは不可能です
-dan3

stdbufは、Cストリームを使用するプログラムのstdinバッファリングも制御できるようです。これは重要と思われます。おそらく、これは将来の読者の利益のために答えに含まれるべきです。
dan3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.