私の考えではすべてstdbuf -oL
パイプはバッファリングされていないため、すべてのパイプコマンドを入力する必要はありません。複数のパイプを持つコマンドを作成するときに、環境変数またはそれをグローバルにアクティブにするものがある場合、または少なくともコマンドの残りのパイプについては良いでしょう。
はい、わかりましたunbuffer
。stdbuf
しかし、パイプごとに呼び出す必要があります。
それは次のとおりです。
今後:
stdbuf -oL command_1 | stdbuf -oL command_2 | stdbuf -oL command_3
後ろに:
BUFFERING=-oL command_1 | command_2 | command_3
答え1
stbuf
GNU 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