如何使任何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