在 cmd 完成之前 tee 输出不会出现

tee output not appearing until cmd finishes

通常,如果我想打印命令的输出并在文件中捕获该输出,tee 是解决方案。但是我正在使用似乎具有特殊行为的实用程序制作脚本。就是wps无线测评工具bully.

如果我 运行 正常执行 bully 命令(没有 tee),输出将以标准方式逐步显示。但是如果我把管道放在最后这样记录 | tee "/path/to/my/logfile" 屏幕上的输出就会冻结。在命令结束之前它什么都不显示。结束后,它一次显示所有内容(不是一步一步),当然它也会将输出放在日志 tee 文件中。

恶霸命令示例:bully wlan0mon -b 00:11:22:33:44:55 -c 8 -L -F -B -v 3 -p 12345670 | tee /root/Desktop/log.txt

为什么?不确定它是否只发生在 bully 上,或者是否有其他程序具有相同的行为。

是否有另一种方法可以将输出实时捕获到文件中,并在屏幕上显示输出?

您看到的是全缓冲与行缓冲。默认情况下,当 stdout 写入 tty(即交互式)时,您将有行缓冲,否则默认为完全缓冲。您可以查看 setvbuf(3) 手册页以获得更详细的解释。

有些命令提供了强制行缓冲的选项(例如 GNU grep 有 --line-buffered)。但这种选择并不广泛。

另一种选择是使用类似 expect 的 unbuffer 命令,如果您希望能够以更交互的方式查看输出(当然,代价是依赖于 expect)。