btmonをポーリングしてデバイス接続を確認するbashスクリプトを作成しようとしています。実用的な解決策がありますが、それはとてつもなく遅く、問題はgrepが一致を見つけた後の終了が非常に遅いことであるようです(約25秒)。 grep
の速度を上げるにはどうすればよいですか アップするか、それを完全に使用しないようにしますか?
#!/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
編集:明確にするために、btmon
また、Bluezスイートの一部であるBluetooth監視ツールであり、cec-clientは、HDMI-CECシリアルバスを介してコマンドを発行するためのlibCECにパッケージ化されたユーティリティです。
承認された回答:
で:
cmd1 | cmd2
ほとんどのシェル(Bourneシェル、(t)csh、yash、およびいくつかの条件下でのAT&T kshの一部のバージョンは、注目すべき例外です)は、両方のcmd1
を待機します。 およびcmd2
。
bash
で 、あなたはそれに気付くでしょう
sleep 1 | uname
1秒後に戻ります。
で:
btmon | grep -m 1 '@ Device Disconnected'
grep
パターンのオカレンスが1つ見つかるとすぐに終了しますが、bash
引き続きbtmon
を待ちます 。
btmon
通常、次にgrep
の後にパイプに書き込むときに、SIGPIPEで停止します。 が戻ってきましたが、二度と何も書き込まない場合、その信号を受信することはありません。
#! /bin/bash
#! /bin/ksh93
bash
と互換性のあるシェルなので パイプラインの最後のコンポーネントのみを待機するもの。次に
btmon | grep -m 1 '@ Device Disconnected'
grep
の後 戻り値、btmon
バックグラウンドで実行されたままになり、シェルはスクリプトの残りの部分を続行します。
btmon
を殺したい場合 grep
とすぐに リターン、POSIXly、あなたは次のようなことをすることができます:
sh -c 'echo "$$"; exec btmon' | (
read pid
grep -m1 '@ Device Disconnected' || exit
kill "$pid" 2> /dev/null
true)