ব্যাশে অগ্রগতি বার তৈরি করুন


14

আমি কীভাবে বাশ দিয়ে একটি অগ্রগতি বার তৈরি করতে পারি?

এটি আমার লিপি:

 #!/bin/bash
 pass='number1 number12 number13 number14 number15 number16'
 chk='number14'
 for i in $pass ; do
 if [ "$i" == "$chk" ]; then
 echo ' Found ^_^'
 else
 echo 'loading 50%'
 fi
 done

আমি echo 'loading 50%'একটি অগ্রগতি বার তৈরি করতে যে কোনও কিছু দিয়ে প্রতিস্থাপন করতে চাই ।


1
টার্মিনালে একটি অগ্রগতি বার বা পৃথক জিইআইআই উইন্ডোতে একটি অগ্রগতি বার?
বাইট কমান্ডার

2
টার্মিনালে
ব্ল্যাক হক

etaআপনি যা চান তা করতে পারে।
আইয়ুব

উত্তর:


14

whiptail উবুন্টু এবং অন্যান্য অনেকগুলি ডিস্ট্রোতে প্রিনস্টাইলে ইনস্টল হয় এবং পূর্ণ-স্ক্রিন (তবে এখনও টার্মিনাল ভিত্তিক) অগ্রগতি উপাদানগুলি প্রদর্শিত হবে।

dialogএটির সুপারস্টার whiptail, সুতরাং এই উদাহরণটি উভয়ের সাথে সমানভাবে কাজ করবে। এটি আরও উন্নত ইউআই উপাদান সরবরাহ করে, সুতরাং যদি আপনি ফাইল বাছাইকারী এবং ফর্মগুলির মতো ব্যবহারকারীর ইন্টারঅ্যাকশনটি সন্ধান করেন তবে এটি কার্যকর হতে পারে তবে অনেক সিস্টেমে এটি ইনস্টল না করার অসুবিধা রয়েছে।

whiptail

কথোপকথন

for i in $(seq 1 100)
do
    sleep 0.1 
    echo $i
done | whiptail --title 'Test script' --gauge 'Running...' 6 60 0

নোট করুন যে স্ক্রিপ্ট আউটপুটটি শতাংশ হিসাবে ব্যাখ্যা করা হয়, সুতরাং আপনাকে সেই অনুযায়ী আপনার আউটপুট সামঞ্জস্য করতে হতে পারে।

হুইপটেল এবং ডায়ালগ আপনাকে রান কন্টেন্টের পরিবর্তে ক্রিপ্টিক সিনট্যাক্সের মাধ্যমে পাঠ্য সংশোধন করার অনুমতি দেয়:

phases=( 
    'Locating Jebediah Kerman...'
    'Motivating Kerbals...'
    'Treating Kessler Syndrome...'
    'Recruiting Kerbals...'
)   

for i in $(seq 1 100); do  
    sleep 0.1

    if [ $i -eq 100 ]; then
        echo -e "XXX\n100\nDone!\nXXX"
    elif [ $(($i % 25)) -eq 0 ]; then
        let "phase = $i / 25"
        echo -e "XXX\n$i\n${phases[phase]}\nXXX"
    else
        echo $i
    fi 
done | whiptail --title 'Kerbal Space Program' --gauge "${phases[0]}" 6 60 0

pvএটির মাধ্যমে পাইপ হওয়া কোনও ফাইল বা স্ট্রিমের অগ্রগতি দেখায়। এটি (সহজে?) কোনও লুপের মতো কাস্টম অপারেশনের অগ্রগতি দেখানোর জন্য ব্যবহৃত হতে পারে না? এটি বিশেষত স্ট্রিমগুলির জন্য ডিজাইন করা হয়েছে।

$ head -c 1G < /dev/urandom | pv -s 1G > /dev/null
 277MB 0:00:16 [17.4MB/s] [========>                           ] 27% ETA 0:00:43

বাস্তবের কয়েকটি উদাহরণ যেখানে কার্যকর pvহয়:

# progress while importing a DB dump
pv mybigfile.sql | mysql -uroot -p dbname

# importing straight from a remote server
ssh user@server 'cat mybigfile.sql.gz' | pv | gzip -cd | mysql -uroot -p dbname

# taking a snapshot of a btrfs partition
btrfs send /snapshots/$date | pv | btrfs receive /mnt/backup/root

আমি এমন কোনও কমান্ড জানি না যা শৈলীতে pvবা এক-লাইনের অগ্রগতি বার দেয় বা না wget, তবে এখানে প্রচুর সরল বাশ / পার্ল / সেড স্ক্রিপ্ট রয়েছে যা সেই কার্যকারিতা যুক্ত করবে, অন্যরা এখানে ভাগ করে নিয়েছে।


আপনার সাথে একটি লুপের প্রক্রিয়াটি দেখানোর pvজন্য এটি এটিকে লুপের আউটপুটটি সন্ধান করতে বা কিছু নকল আউটপুট তৈরি করতে পারে, যেমন echoপ্রতিটি পুনরাবৃত্তির মধ্যে একটি , এটিতে পাইপ pvএবং এটির সাথে পুনরাবৃত্তির সংখ্যা দিতে পারে -s। যদি এটি না চান তবে লুপের স্টাডআউটটি পুনর্নির্দেশ করতে ভুলবেন না /dev/nullএই পদ্ধতির দেখাচ্ছে এমন একটি উদাহরণ এখানে
মিষ্টান্ন

6

আপনি zenityসাধারণ জিটিকে ডায়ালগ উইন্ডো তৈরি করতে ব্যবহার করতে পারেন । উপলব্ধ বিকল্পগুলির মধ্যে একটি হ'ল একটি অগ্রগতি বার সংলাপ।

আপনি ব্যবহার করে যেমন একটি উইন্ডো তৈরি zenity --progress। এটিকে কার্যকর করতে আপনার নীচের কয়েকটি বিকল্প যুক্ত করে (আরও কিছু অংশ man zenity) আরও তথ্য নির্দিষ্ট করতে হবে :

   Progress options
   --text=STRING
          Set the dialog text
   --percentage=INT
          Set initial percentage
   --auto-close
          Close dialog when 100% has been reached
   --auto-kill
          Kill parent process if cancel button is pressed
   --pulsate
          Pulsate progress bar
   --no-cancel
          Hides the cancel button

দুটি পদ্ধতি আছে:

  • পালসেটিং : অগ্রগতি বারটি স্পন্দিত হচ্ছে, এটি কেবল ইঙ্গিত করে যে কিছু চলছে, তবে অগ্রগতির বিষয়ে কিছুই জানায় না। আপনি --pulsatingবিকল্পটি সেট করে এটি করেন ।

  • ম্যানুয়াল : আপনাকে zenityঅগ্রগতি বার আপডেট করতে কমান্ডের স্ট্যান্ডার্ড ইনপুটটিতে বর্তমান অগ্রগতি শতাংশটি পাইপ করতে হবে।
    এর জন্য উদাহরণ নীচের মত দেখতে পারে। নোট করুন যে পূর্ববর্তী কমান্ডগুলি একটি সাব-শেলের সাথে গোষ্ঠীযুক্ত হয়েছে যাতে সমস্ত আউটপুট zenityডায়ালগটিতে পুনর্নির্দেশ করা হয় এবং কেবল সর্বশেষ কমান্ডের মতো নয়:

    (echo 10; sleep 2; echo 20; sleep 2; echo 50; sleep 2) | zenity --progress

শুধু ক্ষেত্রে এটি একটি বিকল্প হবে।
বাইট কমান্ডার

1
দুঃখিত আমার প্রিয়, এটি জিইউআই প্রগতি বার উইন্ডোজ, আমি টার্মিনালে একটি অগ্রগতি বার তৈরি করতে চাই, উদাহরণস্বরূপ আমি স্ক্রিপ্টটি পরীক্ষা করার সময় এটি দেখতে চাই ==>[ ###########--------------] 52%
ব্ল্যাক হক হক

1
হ্যাঁ আমি বুঝেছি. এটি ঠিক যে আমি ইতিমধ্যে আমার উত্তরটির অর্ধেক লিখেছিলাম যখন আপনি এটি বলেছিলেন, তাই ভবিষ্যতে অন্য কারওর প্রয়োজন পড়ার ক্ষেত্রে আমি যেভাবেই হোক পোস্ট করার সিদ্ধান্ত নিয়েছি। আমি আশা করি আপনার আপত্তি নেই, কারণ বেশ কয়েকটি টার্মিনাল ভিত্তিক সমাধানও রয়েছে।
বাইট কমান্ডার

5

এই কোডটি এটি করবে এবং এর জন্য কোনও কিছুই প্রয়োজন নেই (অবশ্যই ব্যাশ ব্যতীত)) এটি #লক্ষণগুলি মুদ্রণ করে, যেমনটি আপনি আপনার মন্তব্যে বলেছেন:

pass='number1 number12 number13 number14 number15 number16'
chk='number14'
passarr=($pass)
lenProgressBar=${#passarr[@]}

echo -n '['
i=0

while [ $i -lt $lenProgressBar ]; do
    echo -n '-'
    ((i++))
done

echo -n ']'
i=0

while [ $i -lt $lenProgressBar ]; do
    echo -e -n '\b'
    ((i++))
done

echo -e -n '\b'
for i in $pass ; do
    if [ "$i" = "$chk" ]; then
        echo -e '#\nFound ^_^'
        break
    else
        echo -n '#'
    fi
done

তবে আপনার যদি চেক করার মতো অনেক কিছু থাকে তবে এটি আপনার স্ক্রিনটিকে #লক্ষণগুলি দিয়ে পূর্ণ করবে । সমস্যাটি সমাধানের জন্য, এই কোডটি ব্যবহার করে দেখুন:

lenProgressBar=5
pass='number1 number12 number13 number14 number15 number16'
chk='number14'
passarr=($pass)
lenPass=${#passarr[@]}

if [ $lenProgressBar -gt $lenPass ]; then
    lenProgressBar=lenPass
elif [ $lenProgressBar -lt 1 ]; then
    lenProgressBar=1
fi

let "chksForEqualsPrint = $lenPass / $lenProgressBar"
echo -n '['
i=0

while [ $i -lt $lenProgressBar ]; do
    echo -n '-'
    ((i++))
done

echo -n ']'
i=0

while [ $i -lt $lenProgressBar ]; do
    echo -e -n '\b'
    ((i++))
done

echo -e -n '\b'
n=1

for i in $pass ; do
    if [ "$i" = "$chk" ]; then
        echo -e '\nFound ^_^'
        break
    else
        if [ $n -eq $chksForEqualsPrint ]; then
            echo -n '#'
            n=1
        else
            ((n++))
        fi
    fi
done

lenProgressBar=5আপনি আপনার অগ্রগতি বার হতে চান এমন দৈর্ঘ্যে প্রথম লাইনে 5 টি পরিবর্তন করুন । #উচ্চ দৈর্ঘ্যের চেয়ে কম দৈর্ঘ্যের অগ্রগতি বারগুলির সাথে একটি চিহ্ন মুদ্রণ করতে আরও বেশি সময় লাগবে , তবে অগ্রগতির বারের দৈর্ঘ্যটি আপনার পর্দার আকারের চেয়ে বেশি হতে দেবে না; আপনি যদি এটি ভাল কাজ করবে না। (এটি আপনাকে চেক করা আইটেমের সংখ্যার চেয়ে বেশি বা 1 এর চেয়ে কম প্রগতি বার ব্যবহার করতে দেবে না)


1
আপনি tput colsটার্মিনাল উইন্ডোটির প্রস্থ সনাক্ত করতে এবং সেই অনুযায়ী অগ্রগতি স্কেল করতে পারেন।
মিক্কেল 21

1

আনসী এস্কেপ কোডগুলি ব্যবহার করে এখানে আরও একটি পদ্ধতি রয়েছে:

#!/bin/bash

pass='number1 number2 number 3 number4 number12 number13 number14 number15 number16'
chk='number15'
result="Not Found!"

echo
echo -n "Working... "
echo -ne "\033[1;32m\033[7m\033[?25l"

for i in $pass ; do
   sleep .4s
   if [ "$i" == "$chk" ]; then
      result="  Found ^_^"
      break
   else
      echo -n " "
   fi
done

echo -ne "\r\033[0m\033[K\033[?25h"
echo $result
echo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.