如何使任何 shell 命令的输出(stdout、stderr)不缓冲?

问题描述 投票:0回答:5

有没有一种方法可以在没有输出缓冲的情况下运行 shell 命令?

例如,

hexdump file | ./my_script
只会将输入从hexdump以缓冲块的形式传递到my_script,而不是逐行传递。

使任何命令的输出不缓冲的通用解决方案是什么?

stdout buffering
5个回答
174
投票

尝试

stdbuf
,它包含在 GNU coreutils 中,因此几乎包含在任何 Linux 发行版中。这会将输入、输出和错误的缓冲区长度设置为零:

stdbuf -i0 -o0 -e0 command

37
投票

来自

unbuffer
包的命令
expect
禁用输出缓冲:
Ubuntu 手册页:unbuffer - unbuffer 输出

使用示例:

unbuffer hexdump file | ./my_script

25
投票

据我所知,如果没有丑陋的黑客手段,你就无法做到这一点。写入管道(或从管道读取)会自动打开完全缓冲,并且您对此无能为力:-(。“行缓冲”(这就是您想要的)仅在读取/写入终端时使用。丑陋的黑客正是这样做的:他们将程序连接到伪终端,以便管道中的其他工具以行缓冲模式从该终端读取/写入。整个问题描述如下:

该页面还提供了一些建议(前面提到的“丑陋的黑客”),即使用

unbuffer
或使用
LD_PRELOAD
进行一些技巧。


23
投票

您还可以使用

script
命令使
hexdump
的输出进行行缓冲(
hexdump
将在伪终端中运行,这会欺骗
hexdump
认为将其标准输出写入终端,而不是一根管子)。

# cf. http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe/
stty -echo -onlcr
script -q /dev/null hexdump file | ./my_script         # FreeBSD, Mac OS X
script -q -c "hexdump file" /dev/null | ./my_script    # Linux
stty echo onlcr

3
投票

应该使用 grep 或egrep“--line-buffered”选项来解决这个问题。不需要其他工具。

© www.soinside.com 2019 - 2024. All rights reserved.