我想每一个管道是无缓冲的,所以我不必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
还有一件事;我们还没有告诉 shell 导出这些内容:
$ export LD_PRELOAD _STDBUF
现在,Cstdout
流在我们运行的程序中应该是无缓冲的。
然而,使用以下命令运行嵌套 shell 似乎更简单setbuf
:
$ stdbuf -oL bash
$ echo $LD_PRELOAD
/usr/lib/x86_64-linux-gnu/coreutils/libstdbuf.so
exec
可以用来替换原来的外壳:
$ exec stdbuf -oL bash