Bash встроенная версия файла трубопровода к bluetoothctl - PullRequest
0 голосов
/ 30 января 2019

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;

Ответы [ 2 ]

0 голосов
/ 17 июля 2019

Вот полный пример того, как взаимодействовать с 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=$1
  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
0 голосов
/ 30 января 2019

Используйте список команд:

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

Обратите внимание, что вы должны добавлять перевод строки или точку с запятой после каждой команды в списке.

...