Bash 管道文件到 bluetoothctl 的内联版本

Bash inline version of piping file to bluetoothctl

bt.sh

#!/bin/bash

echo -e 'scan on\n'
sleep 2
echo -e 'devices\n'
echo -e 'quit\n'

如果我将上述文件通过管道传输到 bluetoothctl,它会按预期工作。

# ./bt.sh  | bluetoothctl

但是我怎样才能将其作为内联脚本来执行,我尝试了以下方法,但它不起作用,而且 bluetoothctl 似乎没有注册命令:

echo -e 'scan on' | bluetoothctl && sleep 2 && echo -e 'devices\n' | bluetoothctl && echo -e 'quit\n' | bluetoothctl;

使用命令列表:

{   printf 'scan on\n\n'
    sleep 2
    printf 'devices\n\n'
    printf 'quit\n\n'
} | bluetoothctl

这是一个完整的示例,说明如何与 bluetoothctl 交互并获取其输出。 命名管道用于提供 bluetoothctl。 您可以修改函数 bleutoothctl_writer 以从文件中读取命令

#!/bin/bash
pipe=/tmp/btctlpipe 
output_file=/tmp/btctl_output

if [[ ! -p $pipe ]]; then
  mkfifo $pipe
fi

trap terminate INT
function terminate()
{
  killall bluetoothctl &>/dev/null
  rm -f $pipe
}

function bleutoothctl_reader() 
{
  {
    while true
    do
      if read line <$pipe; then
          if [[ "$line" == 'exit' ]]; then
              break
          fi          
          echo $line
      fi
    done
  } | bluetoothctl > "$output_file"
}


function bleutoothctl_writer() 
{
  cmd=
  printf "$cmd\n\n" > $pipe
}

bleutoothctl_reader &
sleep 1
bleutoothctl_writer "scan on"
sleep 15
bleutoothctl_writer "scan off"
sleep 1
bleutoothctl_writer "devices"
sleep 1
bleutoothctl_writer "exit"

device_list=$(cat $output_file | grep -e '^Device.*' | sed 's/Device //g')

echo "$device_list"
terminate