如何使任何shell命令的输出无缓冲?

bod*_*ydo 60 stdout buffering

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

例如,hexdump file | ./my_script只会将缓冲块中的hexdump输入传递给my_script,而不是逐行传递.

实际上我想知道如何使任何命令无缓冲的一般解决方案?

jpa*_*kal 119

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

stdbuf -i0 -o0 -e0 command
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说比"unbuffer"效果更好.`stdbuf`传递了任何信号(在我的情况下``SIGUSR2`)我发送给它'`命令`(这是我想要发生的事情),而`unbuffer`似乎不想. (8认同)
  • stdbuf使用前面提到的一个LD_PRELOAD技巧来执行此操作,因此不能使用静态链接或setuid可执行文件.请参阅此问题进行讨论:http://stackoverflow.com/questions/13644024/stdbuf-with-setuid-capabilities/18624182#18624182 (4认同)
  • 我发现这非常有用,但有局限性,因为它不会隐式运行脚本。但是,`stdbuf -o0 bash`使用我所有的脚本和别名运行一个完整的会话,并且在任何命令上都没有输出缓冲,这正是我想要的。当然,缓冲是在从该bash实例退出时恢复的。我正在使用Ubuntu 16.04。 (3认同)
  • 我非常喜欢这个,我把它放在我的 .bash_profile 的第一位。`if [[ "$0" == "-bash" ]]; 然后执行 /usr/bin/stdbuf -i0 -oL -eL /bin/bash -l; 菲` (2认同)
  • 以 `exec` 模式为我工作,用于将输出发送到日志文件,所有输出行都被缓冲而不是完全禁用缓冲: `exec >>(stdbuf -i0 -oL -eL awk '{print strftime("%Y-% m-%d %H:%M:%S"), $0 }' | stdbuf -i0 -oL -eL tee "$LOGFILE") 2>&1` (2认同)

Siu*_*ji- 31

该命令unbufferexpect包禁止输出缓冲:
Ubuntu的联机帮助页:无缓冲-非缓冲输出

用法示例:

unbuffer hexdump file | ./my_script
Run Code Online (Sandbox Code Playgroud)

  • unbuffer似乎合并了命令的stdout和stderr ...(!) (2认同)
  • @olejorgenb是的,它是将stdout和stderr合并的,这是设计使然:unbuffer使用Expect,并且Expect是在人类程序交互中模拟人类的,而人类却看不到输出是stdout还是stderr。 (2认同)

Nor*_*ame 19

AFAIK,你不能没有丑陋的黑客.写入管道(或从中读取)会自动打开完全缓冲,并且您无法对其进行任何操作:-(."线路缓冲"(这是您想要的)仅在读取/写入终端时使用.丑陋的黑客正是这样做的:他们将一个程序连接到一个伪终端,以便管道中的其他工具以行缓冲模式从该终端读/写.整个问题在这里描述:

该页面还有一些建议(前面提到的"丑陋的黑客")要做什么,即使用unbuffer或拉动一些技巧LD_PRELOAD.


小智 19

你也可以使用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
Run Code Online (Sandbox Code Playgroud)