我正在尝试自动将我的耳机与我的 ubuntu16 机器配对。
我拿了这个不错的脚本并尝试了一下,但没有成功。我尝试了一下,发现我可以用这个最小脚本来实现:
#!/usr/bin/expect -f
set prompt '#'
set address [lindex $argv 0]
spawn bluetoothctl &> /dev/null
expect -re $prompt
send "\nconnect <my_mac_addr>\r"
sleep 10
我将其保存为 ./bluetooth.sh,然后使用 ./bluetooth.sh & 运行它,效果很好。但是,我得到了这个烦人的bluetoothctl
输出:
[NEW] Controller *** ### [default]
[NEW] Device *** A
[NEW] Device *** B
[NEW] Device *** C
[bluetooth]#
我尝试使用添加到 spawn 命令的重定向将其删除,但正如您所见,它没有帮助......
删除expect
会起作用,但我不确定这是否是可行的方法......
答案1
您实际上并不需要使用expect
,而可以直接将命令bluetoothctl
作为参数给出。
# ...
bluetoothctl -- power on
bluetoothctl -- connect $mac
# ...
为了提供更完整的示例,下面是我在 Ubuntu 20.04 中用于蓝牙收音机的完整 Bash 脚本:
#!/bin/bash
mac="90:03:B7:17:00:08" # DEH-4400BT
if [ "$1" = "off" ]; then
bluetoothctl -- disconnect
exit $?
fi
# turn on bluetooth in case it's off
rfkill unblock bluetooth
bluetoothctl -- power on
bluetoothctl -- connect $mac
# Use it as default output for PulseAudio
sink=$(pactl list short sinks | grep bluez | awk '{print $2}')
if [ -n "$sink" ]; then
pacmd set-default-sink "$sink" && echo "OK default sink : $sink"
else
echo could not find bluetooth sink
exit 1
fi
$mac
当然,这假设目的地已经配对。
答案2
捕获输出并删除提示......
typeset -a OUTPUT
clean_line () {
local LINE
while read LINE;do
echo ${LINE} | perl -pe 's/\x1b\[[0-9;]*[mG]//g; s/\[.*\]#?//g; s/\x0d\x1b\x20\x0d\x1b\x5b\x4b//g; s/^ //g'
done
}
coproc bluetoothctl
echo -e 'agent on\nconnect 00:0C:8A:FE:ED:18\nexit' >&p
OUTPUT=("${(f)$(cat <&p | clean_line)}")
NDX=0
for L in ${OUTPUT};do
((NDX++))
printf "%d) %s\n" ${NDX} ${L}
done