ম্যাচ খুঁজে বের করার পরে ধীরে ধীরে গ্রেপ করবেন?


20

আমি একটি বাশ স্ক্রিপ্ট লেখার চেষ্টা করছি যা ডিভাইস সংযোগের জন্য বিটিমনে পোল করে। আমি একটি কার্যনির্বাহী সমাধান পেয়েছি, তবে এটি অযৌক্তিকভাবে ধীর গতির এবং এটি মনে হচ্ছে ম্যাচটি খুঁজে পাওয়ার পরে (প্রায় 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এবং এটি একটি ব্লুটুথ মনিটরিং সরঞ্জাম যা ব্লুজ স্যুটটির অংশ, এবং সিইসি-ক্লায়েন্ট এমন একটি ইউটিলিটি যা এইচডিএমআই-সিইসি সিরিয়াল বাস (অন্যান্য বিষয়গুলির মধ্যে) জুড়ে কমান্ড দেওয়ার জন্য libCEC এর সাথে প্যাকেজড।


2
কত "স্টাফ" btmonআউটপুট দেয়? আপনি কি নিশ্চিত যে এটি কেবল বাফারিংয়ের বিষয় নয়?
স্টিল্ড্রাইভার

টুইটারে আপনি কি পাইপে বাফারিং অক্ষম করার চেষ্টা করেছেন ?
l0b0

বিটিমন প্রতি সেকেন্ডে প্রায় 250 টি অক্ষর আউটপুট করে।
রব

@ l0b0 আমি আনফার কমান্ডের সাহায্যে বাফারিং নিষ্ক্রিয় করার চেষ্টা করেছি, তবে এটি গ্রেপকে আদৌ বেরিয়ে আসা থেকে বিরত রাখতে পারে? আমি গ্রেপকে - লাইন-বাফার মোডে জোর করেও চেষ্টা করেছি, তবে এটি কোনওরকম সাহায্য করবে বলে মনে হয় না।
রব

এটি হতে পারে যে btmonনিজেকে বাফারিং প্রয়োগ করে, এক্ষেত্রে আপনার ভাগ্যের বাইরে।
l0b0

উত্তর:


28

ভিতরে:

cmd1 | cmd2

সর্বাধিক শাঁস (বোর্ন শেল, (T) csh শেল, সেইসাথে যশ এবং উল্লেখযোগ্য ব্যতিক্রম ছাড়া হচ্ছে কিছু অবস্থার অধীনে যেমন AT & T ksh কিছু সংস্করণ) উভয়ের জন্য অপেক্ষা cmd1এবং cmd2

ইন bash, আপনি এটি লক্ষ্য করবেন

sleep 1 | uname

এক সেকেন্ড পরে ফিরে আসে।

ভিতরে:

btmon | grep -m 1 '@ Device Disconnected'

grepএটি প্যাটার্নটির একটি ঘটনা খুঁজে পাওয়া মাত্রই বেরিয়ে যাবে, তবে bashএখনও অপেক্ষা করবে btmon

btmongrepফিরে আসার পরে যখন পাইপটিতে লিখতে থাকে তখন সাধারণত একটি সিগপাইপের কারণে মারা যায় , তবে যদি এটি আর কখনও কিছু না লিখেন তবে এটি কখনই সেই সংকেত লাভ করতে পারে না।

আপনি প্রতিস্থাপন করতে পারে #! /bin/bashসঙ্গে #! /bin/ksh93যেমন করে একটি শেল সঙ্গে সামঞ্জস্যপূর্ণ bashএবং এক যে শুধুমাত্র একটি পাইপলাইন শেষ উপাদান জন্য অপেক্ষা করে। তারপরে

btmon | grep -m 1 '@ Device Disconnected'

grepপ্রত্যাবর্তনের পরে , btmonপটভূমিতে চলমান ছেড়ে দেওয়া হবে এবং শেলটি স্ক্রিপ্টের বাকী অংশটি চালিয়ে যাবে।

আপনি যদি POSIXly, রিটার্নের সাথে btmonসাথেই হত্যা করতে চান তবে আপনি grepএমন কিছু করতে পারেন:

sh -c 'echo "$$"; exec btmon' | (
   read pid
   grep -m1 '@ Device Disconnected' || exit
   kill "$pid" 2> /dev/null
   true)

3
এটি কেন এরকম আচরণ করে তা বোঝানোর জন্য ধন্যবাদ। আমার কাছে এটি ঘটেনি যে ব্যাশ সম্ভবত বিটিমনের বাইরে যাওয়ার জন্য অপেক্ষা করছে। Ksh93 এ অদলবদল সুন্দরভাবে কাজ করে!
রব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.