Estoy tratando de escribir un script bash que sondee btmon para las conexiones del dispositivo. Tengo una solución que funciona, pero es absurdamente lenta, y parece que el problema es que grep es muy lento para salir después de encontrar una coincidencia (alrededor de 25 segundos). ¿Qué puedo hacer para acelerar grepo evitar usarlo por completo?
#!/bin/bash
COUNTER=0
while :
do
until btmon | grep -m 1 '@ Device Connected'
do :
done
let COUNTER=COUNTER+1
echo on 0 | cec-client RPI -s -d 1
sleep 5
echo as | cec-client RPI -s -d 1
until btmon | grep -m 1 '@ Device Disconnected'
do :
done
let COUNTER=COUNTER-1
if [ $COUNTER -eq 0 ];
then echo standby 0 | cec-client RPI -s -d 1;
fi
done
editar: para aclarar, btmony es una herramienta de monitoreo de bluetooth que es parte de la suite Bluez, y cec-client es una utilidad que está empaquetada con libCEC para emitir comandos a través del bus serie HDMI-CEC (entre otras cosas).

btmon? ¿estás seguro de que no es solo una cuestión de almacenamiento en búfer?btmonimplementa el almacenamiento en búfer, en cuyo caso no tiene suerte.Respuestas:
En:
La mayoría de los shells (el shell Bourne, (t) csh, así como el yash y algunas versiones de AT&T ksh en algunas condiciones son las excepciones notables) esperan ambos
cmd1ycmd2.En
bash, notarás queregresa después de un segundo.
En:
grepsaldrá tan pronto como haya encontrado una aparición del patrón, perobashaún esperarábtmon.btmonnormalmente morirá de un SIGPIPE la próxima vez que escriba en la tubería después degrephaya regresado, pero si nunca vuelve a escribir nada, nunca recibirá esa señal.Se podría sustituir a
#! /bin/bashla#! /bin/ksh93ya que es una cáscara compatible conbashy que sólo espera a que el último componente de un oleoducto. Entonces endespués
grepretornos,btmonse dejaría ejecutándose en segundo plano y el shell continuaría con el resto del script.Si quisieras matar
btmontan pronto comogrepregrese, POSIXly, podrías hacer algo como:fuente