Saya mencoba menulis skrip bash yang memilih btmon untuk koneksi perangkat. Saya punya solusi yang berfungsi, tetapi ini sangat lambat, dan sepertinya masalahnya adalah sangat lambat untuk keluar setelah menemukan kecocokan (sekitar 25 detik). Apa yang bisa saya lakukan untuk mempercepat grep
atau menghindari menggunakannya sama sekali?
#!/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
sunting: Untuk memperjelas, btmon
dan merupakan alat pemantauan bluetooth yang merupakan bagian dari paket Bluez, dan cec-client adalah utilitas yang dikemas dengan libCEC untuk mengeluarkan perintah di bus serial HDMI-CEC (di antara hal-hal lain).
btmon
dihasilkan? apakah Anda yakin itu bukan hanya masalah buffering?btmon
mengimplementasikan buffering sendiri, dalam hal ini Anda kurang beruntung.Jawaban:
Di:
Sebagian besar shell (shell Bourne, (t) csh, serta yash dan beberapa versi AT&T ksh dalam beberapa kondisi menjadi pengecualian yang menonjol) menunggu keduanya
cmd1
dancmd2
.Di
bash
, Anda akan melihat itukembali setelah satu detik.
Di:
grep
akan keluar segera setelah menemukan satu kemunculan pola, tetapibash
masih akan menunggubtmon
.btmon
biasanya akan mati karena SIGPIPE saat berikutnya ia menulis ke pipa setelahgrep
kembali, tetapi jika ia tidak pernah menulis apapun lagi, ia tidak akan pernah menerima sinyal itu.Anda bisa menggantinya
#! /bin/bash
dengan#! /bin/ksh93
shell yang kompatibel denganbash
dan yang hanya menunggu komponen terakhir pipa. Lalu masuksetelah
grep
kembali,btmon
akan dibiarkan berjalan di latar belakang dan shell akan melanjutkan dengan sisa skrip.Jika Anda ingin membunuh
btmon
segera setelahgrep
pengembalian, POSIXly, Anda dapat melakukan sesuatu seperti:sumber