如何使任何shell命令的输出无缓冲?
有没有办法运行没有输出缓冲的shell命令?
例如, hexdump file | ./my_script
hexdump file | ./my_script
只会将缓冲块中的input从hexdump传递给my_script,而不是逐行传递。
其实我想知道一个通用的解决scheme如何使任何命令无缓冲?
AFAIK,你不能没有丑陋的黑客。 写入一个pipe道(或从中读取)会自动打开完全缓冲,并且你无能为力:-(。“线路缓冲”(这是你想要的)仅在读/写terminal时使用。丑陋的黑客正是这样做的:他们将一个程序连接到一个伪terminal,以便pipe道中的其他工具以线缓冲模式从该terminal读/写,整个问题描述如下:
该页面也有一些build议(上述“丑陋的黑客”)做什么,即使用unbuffer
或拉动一些技巧与LD_PRELOAD
。
尝试使用stdbuf
,包含在GNU coreutils中,因此实际上是任何Linux发行版。 这将input,输出和错误的缓冲区长度设置为零:
stdbuf -i0 -o0 -e0 command
expect
软件包中的命令unbuffer
会禁用输出缓冲:
Ubuntu的手册页:unbuffer – unbuffer输出
用法示例:
unbuffer hexdump file | ./my_script
你也可以使用script
命令来使hexdump
行输出缓冲行( hexdump
将运行在一个伪terminal,它使用hexdump
转换为hexdump
它的stdout写入terminal,而不是pipe道)。
# 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