*nixシェル:コマンドのすべてのパイプに対してパイプバッファリングを無効にする方法は?

*nixシェル:コマンドのすべてのパイプに対してパイプバッファリングを無効にする方法は?

私の考えではすべてstdbuf -oLパイプはバッファリングされていないため、すべてのパイプコマンドを入力する必要はありません。複数のパイプを持つコマンドを作成するときに、環境変数またはそれをグローバルにアクティブにするものがある場合、または少なくともコマンドの残りのパイプについては良いでしょう。

はい、わかりましたunbufferstdbufしかし、パイプごとに呼び出す必要があります。

それは次のとおりです。

今後:

stdbuf -oL command_1 | stdbuf -oL command_2 | stdbuf -oL command_3

後ろに:

BUFFERING=-oL command_1 | command_2 | command_3

答え1

stbufGNU Coreutilsのユーティリティは環境変数を設定し、LD_PRELOADすべての子プロセスが共有ライブラリを開くように強制します。libstdbuf.soまた、ライブラリに引数を渡すために別の変数を設定します。

これらの環境変数を直接設定できます。

env彼らが何であるかを見てみましょう:

$ stdbuf -oL env | grep -E '^LD_PRELOAD|^_STDBUF_'
_STDBUF_O=L
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/coreutils/libstdbuf.so

さて、eval上記の内容があれば次のようになります。

$ eval $(stdbuf -oL env | grep -E '^LD_PRELOAD|^_STDBUF_')
$ echo $LD_PRELOAD 
/usr/lib/x86_64-linux-gnu/coreutils/libstdbuf.so
$ echo $_STDBUF_O 
L

もう一つ、私たちはまだこのアイテムをエクスポートするようにシェルに指示していません。

$ export LD_PRELOAD _STDBUF

stdout今、私たちが実行しているプログラムでCストリームをバッファリング解除する必要があります。

ただし、次のようにネストされたシェルを実行する方が簡単ですsetbuf

$ stdbuf -oL bash
$ echo $LD_PRELOAD
/usr/lib/x86_64-linux-gnu/coreutils/libstdbuf.so

exec元のシェルを交換するために使用できます。

$ exec stdbuf -oL bash

関連情報