J'essaie d'écrire un script bash qui interroge btmon pour les connexions de périphériques. J'ai une solution qui fonctionne, mais c'est absurdement lent, et il semble que le problème soit que grep soit très lent à quitter après avoir trouvé une correspondance (environ 25 secondes). Que puis-je faire pour accélérer grep
ou éviter complètement de l'utiliser?
#!/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
edit: Pour clarifier, btmon
et est un outil de surveillance Bluetooth qui fait partie de la suite Bluez, et cec-client est un utilitaire fourni avec libCEC pour émettre des commandes sur le bus série HDMI-CEC (entre autres).
btmon
sortent? êtes-vous sûr que ce n'est pas seulement une question de mise en mémoire tampon?btmon
implémente le tampon lui-même, auquel cas vous n'avez pas de chance.Réponses:
Dans:
La plupart des shells (le shell Bourne, (t) csh, ainsi que le yash et certaines versions d'AT & T ksh sous certaines conditions étant les exceptions notables) attendent les deux
cmd1
etcmd2
.Dans
bash
, vous remarquerez querevient après une seconde.
Dans:
grep
quittera dès qu'il aura trouvé une occurrence du modèle, maisbash
attendra toujoursbtmon
.btmon
meurt généralement d'un SIGPIPE la prochaine fois qu'il écrit dans le tuyau aprèsgrep
son retour, mais s'il n'écrit plus jamais, il ne recevra jamais ce signal.Vous pouvez remplacer
#! /bin/bash
par#! /bin/ksh93
car c'est un shell compatible avecbash
et un qui n'attend que le dernier composant d'un pipeline. Puis dansaprès les
grep
retours,btmon
serait laissé tourner en arrière-plan et le shell continuerait avec le reste du script.Si vous vouliez tuer
btmon
dès legrep
retour, POSIXly, vous pourriez faire quelque chose comme:la source