修改 bluetoothctl 自动化脚本-如何从 expect 和 spawn 中删除输出?

修改 bluetoothctl 自动化脚本-如何从 expect 和 spawn 中删除输出?

我正在尝试自动将我的耳机与我的 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

相关内容