web-dev-qa-db-ja.com

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

Unbuffer(1)とstdbuf(1)の間に違いはありますか?私が収集したものから、unbufferは、最初にlibc関数set(X)bufを呼び出して、それを可能にするという「最善の努力」以上のことをしていますか?

13
dan3

彼らは完全に異なる方法で動作します。

プログラムunbufferは、指定されたコマンドを実行するためにexpectを使用します。 expectは子プロセスのstdoutに接続するための疑似ttyを作成するため、ブロックバッファリングの代わりにラインバッファリングを使用する必要があると子供がだまされてしまう可能性があります。 isatty(stdout)がtrueの場合、一部のプログラムは動作を変更しますが、他のプログラムは変更せず、どちらが機能し、どちらが機能しないかを知るのは非常に困難です。

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

私はこれを見つけました

 apt-get source expect coreutils

そして、各プログラムに関連するソースを読みます。

14
msw