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
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