有没有办法在没有输出缓冲的情况下运行 shell 命令?
例如,hexdump file | ./my_script
只会将来自 hexdump 的输入以缓冲块的形式传递给 my_script,而不是逐行传递。
其实我想知道一个通用的解决方案如何使任何命令无缓冲?
Try stdbuf
,包含在 GNU coreutils 中,因此几乎包含在任何 Linux 发行版中。这将输入、输出和错误的缓冲区长度设置为零:
stdbuf -i0 -o0 -e0 command
unbuffer
包中的命令expect
禁用输出缓冲:
Ubuntu Manpage: unbuffer - unbuffer output
示例用法:
unbuffer hexdump file | ./my_script
AFAIK,如果没有丑陋的黑客,你就无法做到。写入管道(或从中读取)会自动打开完全缓冲,您对此无能为力:-(。“行缓冲”(这是您想要的)仅在读/写终端时使用。丑陋的黑客正是这样做的:他们将程序连接到伪终端,以便管道中的其他工具以行缓冲模式从该终端读取/写入。整个问题在这里描述:
该页面也有一些建议(前面提到的“丑陋的黑客”)做什么,即使用unbuffer
或拉一些技巧LD_PRELOAD
。
您还可以使用该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
应该使用 grep 或 egrep “--line-buffered” 选项来解决这个问题。不需要其他工具。