一些命令行程序可以选择修改其标准输出流缓冲行为。如果 C 源代码可用,这就是要走的路……
# two command options ...
man file | less -p '--no-buffer'
man grep | less -p '--line-buffered'
# ... and their respective source code
# from: http://www.opensource.apple.com/source/file/file-6.2.1/file/src/file.c
if(nobuffer)
(void) fflush(stdout);
# from: http://www.opensource.apple.com/source/grep/grep-28/grep/src/grep.c
if (line_buffered)
fflush (stdout);
作为使用 expect 的 unbuffer 脚本或修改程序源代码的替代方法,您还可以尝试使用 script(1) 来避免管道引起的 stdout 打嗝:
请参阅:诱使应用程序认为其标准输入是交互式的,而不是管道
# Linux
script -c "[executable string]" /dev/null
# FreeBSD, Mac OS X
script -q /dev/null "[executable string]"