2016-03-09 68 views
6

我該如何grep'hcitool lescan'的輸出,或者就此而言,將它管道化爲任何東西。當我從'hcitool lescan'輸入任何東西時,似乎沒有輸出。grep hcitool lescan output

[email protected]:/mnt/rtd# hcitool lescan |grep B 

^[email protected]:/mnt/rtd# hcitool lescan | tee foo 

^[email protected]:/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 

回答

4

問題是標準輸出緩衝。 'hcitool lescan'在每個新發現的設備後都不刷新它的輸出,它只是用'\ n'打印它們(至少在我看到的bluez 5.27源代碼中)。默認情況下,如果stdout是一個終端,那麼緩衝區會自動設置爲'行緩衝',否則它將被設置爲緩衝區(有關完整說明,請參閱here)。 因此,當您將hcitool的輸出重定向到grep時,它會被緩衝。如果您等待足夠長時間,您會看到來自grep的預期輸出。 爲了克服這一點,你可以使用stdbuf與標準輸出線緩衝運行hcitool:

$ stdbuf -oL hcitool萊斯康| grep的乙

+0

不幸的是我似乎沒有對英特爾edision/yocto coreutilities stdbuf,並且還沒有想出哪裏可以找到他們。 –

0

確保與sudo運行:

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

與OP的問題無關,但我發現安裝'moreutils'軟件包並使用'ts'命令爲每個條目添加時間戳是非常有用的:'sudo stdbuf -oL hcitool lescan --duplicates | ts | grep ' – kaptan