*nix shell:如何禁用命令中所有管道的管道缓冲?

*nix shell:如何禁用命令中所有管道的管道缓冲?

我想每一个管道是无缓冲的,所以我不必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

还有一件事;我们还没有告诉 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

相关内容