如何将蓝牙控制脚本改写为有效Bash内联命令?
解决bluetoothctl内联命令不生效的问题
你遇到的这个坑其实挺常见的——单独用脚本管道给bluetoothctl能正常跑扫描、列设备,但拆成多个echo | bluetoothctl加&&的内联命令就完全没反应,核心原因很简单:
你之前的写法里,每一段echo ... | bluetoothctl都会启动一个全新的bluetoothctl进程。第一个进程执行完scan on就退出了,第二个启动的bluetoothctl是完全独立的会话,根本没执行过扫描操作,devices自然出不来结果;第三个quit更是对着一个全新的进程发命令,完全没用。
要解决这个问题,关键是让所有命令都进入同一个bluetoothctl进程里执行,这里给你两种可行的内联写法:
方法一:子shell组合命令一次性管道
把所有需要执行的命令(包括shell层面的sleep)放在一个子shell里,按顺序输出给bluetoothctl,这样所有命令都会进入同一个会话:
( echo -e 'scan on'; sleep 2; echo -e 'devices'; echo -e 'quit' ) | bluetoothctl
方法二:Here-String写法(更简洁)
如果你的bash版本支持Here-String(大部分现代系统都支持),也可以用这种方式,把命令按换行拼接后传给bluetoothctl,中间用sleep在shell层面等待扫描:
bluetoothctl <<< "$(echo -e 'scan on'; sleep 2; echo -e 'devices\nquit')"
这两种写法都能完美模拟你原来脚本的逻辑:先开启扫描,等待2秒让设备被发现,再列出设备,最后退出bluetoothctl会话。
内容的提问来源于stack exchange,提问作者crankshaft
相关产品推荐
相关产品推荐

