GNU/Linux >> Linux の 問題 >  >> Linux

一致を見つけた後、Grepの終了が遅いですか?

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)

Linux
  1. Sed、Awk、またはGrepを使用したマルチラインパターンマッチ?

  2. Grepを使用して行の最後のアイテムを検索しますか?

  3. コマンドライン経由でLinuxのプロセス数を見つける

  1. Windowsで行末の正規表現一致を使用するには?

  2. grep -q でコード 141 を終了するのはなぜですか?

  3. Bashで二重文字を見つけるための正規表現

  1. 複数のパターンでGrepを実行する方法は?

  2. 最初の一致後に検索コマンドを停止する方法は?

  3. Sedを使用してパターンマッチ後に前の行を印刷しますか?