有没有一种方法可以运行shell命令而不进行输出缓冲?
例如,hexdump file | ./my_script
仅将输入的十六进制转储以缓冲的块形式传递给my_script,而不是逐行传递。
实际上我想知道一个通用的解决方案,如何使任何命令都无缓冲?
AFAIK,没有丑陋的黑客,你做不到。写入管道(或从管道读取)会自动打开完整缓冲,您对此无能为力:-(。“ Line buffering”(这是您想要的)仅在读取/写入终端时使用。丑陋的黑客正是这样做的:他们将程序连接到伪终端,以便管道中的其他工具以行缓冲模式从该终端读取/写入。整个问题描述如下:
该页面还提供了一些建议(前面提到的“丑陋的骇客”),例如使用unbuffer
或使用LD_PRELOAD
拉一些技巧。
尝试stdbuf
,包含在GNU coreutils中,因此实际上是任何Linux发行版。这会将输入,输出和错误的缓冲区长度设置为零:
unbuffer
软件包中的命令expect
禁用输出缓冲:Ubuntu Manpage: unbuffer - unbuffer output
[您也可以使用script
命令使hexdump
的输出成为行缓冲的(hexdump
将在伪终端中运行,这会诱骗hexdump
考虑将其stdout写入终端,而不是到管道)。
对于macOS上的某些命令,您可以使用NSBufferedIO
环境变量: