如何使任何shell命令的输出无缓冲?

时间:2010-08-12 07:36:04

标签: stdout buffering

有没有办法在没有输出缓冲的情况下运行shell命令?

例如,hexdump file | ./my_script只会将缓冲块中的hexdump输入传递给my_script,而不是逐行传递。

实际上我想知道如何使任何命令无缓冲的一般解决方案?

6 个答案:

答案 0 :(得分:110)

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

stdbuf -i0 -o0 -e0 command

答案 1 :(得分:31)

unbuffer包中的expect命令禁用输出缓冲:
Ubuntu Manpage: unbuffer - unbuffer output

使用示例:

unbuffer hexdump file | ./my_script

答案 2 :(得分:18)

AFAIK,没有丑陋的黑客你就做不到。写入管道(或从中读取)会自动打开完全缓冲,并且您无法做任何事情:-(。“线路缓冲”(这是您想要的)仅在读取/写入终端时使用。丑陋的黑客正是这样做的:他们将程序连接到伪终端,以便管道中的其他工具以线缓冲模式从该终端读/写。整个问题在这里描述:

该页面还有一些建议(前面提到的“难看的黑客”)要做什么,即使用unbuffer或用LD_PRELOAD拉一些技巧。

答案 3 :(得分:18)

您还可以使用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

答案 4 :(得分:1)

对于macOS上的某些命令,您可以使用NSUnbufferedIO环境变量:

这适用于使用Apple Foundation框架的程序,例如/usr/sbin/softwareupdate之类的OS内置程序,以及其他Swift或Objective-C实用程序:

NSUnbufferedIO=YES cmd > output

在网上搜索了一会儿之后,这就是我的用例,因为stdbufunbuffer尚未预装macOS。

答案 5 :(得分:0)

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