82

有没有办法在没有输出缓冲的情况下运行 shell 命令?

例如,hexdump file | ./my_script只会将来自 hexdump 的输入以缓冲块的形式传递给 my_script,而不是逐行传递。

其实我想知道一个通​​用的解决方案如何使任何命令无缓冲?

4

5 回答 5

154

Try stdbuf,包含在 GNU coreutils 中,因此几乎包含在任何 Linux 发行版中。这将输入、输出和错误的缓冲区长度设置为零:

stdbuf -i0 -o0 -e0 command
于 2014-08-28T12:35:05.807 回答
32

unbuffer包中的命令expect禁用输出缓冲:
Ubuntu Manpage: unbuffer - unbuffer output

示例用法:

unbuffer hexdump file | ./my_script
于 2010-08-12T08:50:18.897 回答
24

AFAIK,如果没有丑陋的黑客,你就无法做到。写入管道(或从中读取)会自动打开完全缓冲,您对此无能为力:-(。“行缓冲”(这是您想要的)仅在读/写终端时使用。丑陋的黑客正是这样做的:他们将程序连接到伪终端,以便管道中的其他工具以行缓冲模式从该终端读取/写入。整个问题在这里描述:

该页面也有一些建议(前面提到的“丑陋的黑客”)做什么,即使用unbuffer或拉一些技巧LD_PRELOAD

于 2010-08-12T08:04:34.373 回答
21

您还可以使用该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
于 2013-05-07T15:00:03.520 回答
0

应该使用 grep 或 egrep “--line-buffered” 选项来解决这个问题。不需要其他工具。

于 2021-05-17T06:19:14.750 回答