Grep hcitool lescan 输出

Grep hcitool lescan output

如何对 'hcitool lescan' 的输出进行 grep 或将其通过管道传输到任何内容。似乎当我从 'hcitool lescan' 中传输任何内容时,我没有得到任何输出。

root@edison:/mnt/rtd# hcitool lescan |grep B

^Croot@edison:/mnt/rtd# hcitool lescan | tee foo

^Croot@edison:/mnt/rtd# hcitool lescan
LE Scan ...
B0:B4:48:xx:xx:xx (unknown)
B0:B4:48:xx:xx:xx xxxxxxxx
B0:B4:48:yy:yy:yy (unknown)
B0:B4:48:yy:yy:yy yyyyyyyy

问题出在标准输出缓冲上。 'hcitool lescan' 不会在每个新发现的设备后刷新其输出,它只是用 '\n' 打印它们(至少在我正在查看的 bluez 5.27 源代码中是这样)。默认情况下,如果 stdout 是终端,则缓冲会自动设置为 'line buffered',否则它会设置为缓冲(请参阅 here 了解完整说明)。 因此,例如,当您将 hcitool 的输出重定向到 grep 时,它会被缓冲。如果您等待的时间足够长,您会看到 grep 的预期输出。 为了克服这个问题,您可以使用 stdbuf 到 运行 hcitool with stdout line-buffering:

$stdbuf -oL hcitool lescan | grep B

确保 运行 与 sudo:

$ sudo stdbuf -oL hcitool lescan | grep <pattern>