我正在使用以下命令行,以便通过bluetoothctl工具向我的设备控制器发送命令。
#!/bin/sh
{ sleep 1 && echo -e 'power on \n' && sleep 1;} | bluetoothctl
终端返回:
root@snp:~# ./bt.sh
[NEW] Controller 01:02:03:04:05:C3 snp [default]
[NEW] Device 98:0D:2E:E5:14:81 HTC
Changing power on succeeded
[CHG] Controller 01:02:03:04:05:C3 Powered: yes
[DEL] Controller 01:02:03:04:05:C3 snp [default]
我想减少和管理返回的邮件数量。基本上,我想在屏幕上显示并存储在日志文件中:
Changing power on succeeded
[CHG] Controller 01:02:03:04:05:C3 Powered: yes
我输入
{ sleep 1 && echo -e 'power on \n' && sleep 1;} | bluetoothctl | grep -E "Changing|[CHG]" 2>&1 | tee log.txt
但我得到了,
root@snp:~# ./bt.sh
[NEW] Controller 01:02:03:04:05:C3 snp [default]
[NEW] Device 01:02:03:04:05:C3 HTC
Changing power on succeeded
[DEL] Controller 01:02:03:04:05:C3 snp [default]
我的错在哪里?
此外,是否有可能通过条件测试来测试Powered =是或否,并且所有内容都在同一行中进行测试?
编辑n°1:
实际上,状态消息并未针对标准错误,2& 1是无用的。
然而,我通过以下方式尝试了你的命题:
{ sleep 1 && echo -e 'power on \n' && sleep 1;} | bluetoothctl | grep -E 'Changing|\[CHG]'
总是返回的
root@snp:~# ./bt.sh
Changing power on succeeded
而不是
root@snp:~# ./bt.sh
Changing power on succeeded
[CHG] Controller 01:02:03:04:05:C3 Powered: yes
答案 0 :(得分:1)
正则表达式[CHG]
是一个与C
,H
或G
中的任何一个匹配的字符类。如果你想在字面上匹配一个开头方括号,你必须逃避它。
grep -E 'Changing|\[CHG]'
此外,您可能想要检查状态消息是否定向到标准错误。如果是这样,请尝试
... | bluetoothctl 2>&1 | grep ...
您拥有的grep 2>&1
重定向似乎没有任何用处。