Sto cercando di scrivere uno script bash che esegua il polling di btmon per le connessioni dei dispositivi. Ho una soluzione funzionante, ma è assurdamente lenta e sembra che il problema sia che grep è molto lento a uscire dopo aver trovato una corrispondenza (circa 25 secondi). Cosa posso fare per velocizzare grep up o evitare di usarlo del tutto?
#!/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
 modifica:per chiarire, btmon ed è uno strumento di monitoraggio Bluetooth che fa parte della suite Bluez, e cec-client è un'utilità inclusa in libCEC per l'emissione di comandi attraverso il bus seriale HDMI-CEC (tra le altre cose).
Risposta accettata:
In:
cmd1 | cmd2
 La maggior parte delle shell (la Bourne shell, (t)csh, così come yash e alcune versioni di AT&T ksh in alcune condizioni essendo le eccezioni notevoli) aspettano entrambi cmd1 e cmd2 .
 In bash , lo noterai
sleep 1 | uname
ritorna dopo un secondo.
In:
btmon | grep -m 1 '@ Device Disconnected'
 grep uscirà non appena avrà trovato un'occorrenza del pattern, ma bash attenderà ancora btmon .
 btmon in genere morirà di un SIGPIPE la prossima volta che scriverà nella pipe dopo grep è tornato, ma se non scrive più nulla, non riceverà mai quel segnale.
 Potresti sostituire #! /bin/bash con #! /bin/ksh93 dato che è una shell compatibile con bash e uno che attende solo l'ultimo componente di una pipeline. Poi in
btmon | grep -m 1 '@ Device Disconnected'
 dopo grep restituisce, btmon verrebbe lasciato in esecuzione in background e la shell continuerebbe con il resto dello script.
 Se volevi uccidere btmon non appena grep restituisce, POSIXly, potresti fare qualcosa del tipo:
sh -c 'echo "$$"; exec btmon' | (
   read pid
   grep -m1 '@ Device Disconnected' || exit
   kill "$pid" 2> /dev/null
   true)