পূর্ববর্তী আউটপুটটি এড করার পরিবর্তে বাশ-এ লিখুন


22

ব্যাশ টাইমারের জন্য আমি এই কোডটি ব্যবহার করি:

#!/bin/bash
sek=60
echo "60 Seconds Wait!"
echo -n "One Moment please "
while [ $sek -ge 1 ]
do
   echo -n "$sek "  
sleep 1
   sek=$[$sek-1]
done
echo
echo "ready!"

এটি আমাকে এমন কিছু দেয়

One Moment please: 60 59 58 57 56 55 ...

দ্বিতীয়টির সর্বশেষ মানটিকে খুব সাম্প্রতিককালে প্রতিস্থাপন করার কোনও সম্ভাবনা রয়েছে যাতে আউটপুট একটি বড় ট্রেল তৈরি না করে তবে এক পজিশনে রিয়েল টাইমের মতো সেকেন্ডের কাউন্টডাউন করে? (আশা করি আপনি কী বোঝাতে চেয়েছেন :))


watchকমান্ডটি দিয়ে এটি করার একটি উপায় থাকতে পারে , যদিও এটি ঠিক কীভাবে করবেন তা আমি নিশ্চিত নই।
এজেম্যানসফিল্ড

উত্তর:


14
#!/bin/bash
sek=60
echo "60 Seconds Wait!"
echo -n "One Moment please "
while [ $sek -ge 1 ]
do
   echo -n "$sek" 

sleep 1
   sek=$[$sek-1]
   echo -en "\b\b"
done
echo
echo "ready!"

2
আশ্চর্যজনক, অনেক ধন্যবাদ অন্যান্য পাঠকদের জন্য কেবল একটি বিজ্ঞপ্তি উপরের কোডটি ফিট করার জন্য আপনার জায়গার কারণে প্রতিধ্বনি -en "\ b \ b \ b" ব্যবহার করতে হবে।
NES

1
+1 টি নিস, কিন্তু ... 10 নীচের এটি বার্তা খাওয়া শুরু হয় ...
Lepe

1
হ্যাঁ, ব্যবহার করা ভাল \r। আমার উত্তর দেখুন।
মাইকেল

3
ব্যাশ এর ম্যানুয়াল থেকে: The old format $[expression] is deprecated and will be removed in upcoming versions of bash.। পরিবর্তে POSIX $((expression))বা- ((কম্যান্ড ব্যবহার করুন। যেমন sek=$(( sek - 1 ))বা (( sek = sek - 1 ))বা (( sek-- ))
গিরিহা

17

মূলত অনীশপের উত্তর হিসাবে একই, তবে \rব্যাকস্পেস ( \b) এর পরিবর্তে রিটার্ন ( ) ব্যবহার করে কারণ দৈর্ঘ্য সর্বদা একই থাকবে কিনা আমরা জানি না, যেমন কখন $sek < 10

এছাড়াও, আপনার প্রথমটি echoব্যবহার করা উচিত $sek, হার্ড-কোড নয় 60

অবশেষে, এর পরে স্থানটি নোট করুন ...

#!/bin/bash
sek=60
echo "$sek Seconds Wait!"
while [ $sek -ge 1 ]
do
   echo -ne "One Moment please $sek ... \r"
   sleep 1
   sek=$[$sek-1]
done
echo
echo "ready!"

7

ব্যাশের সাহায্যে আপনি বিশেষ পরিবর্তনশীলটি ব্যবহার করতে পারেন SECONDS

#BASH
SECONDS=0;
while sleep .5 && ((SECONDS <= 60)); do 
    printf '\r%s: %2d' "One moment please" "$((60-SECONDS))"
done
printf '\n'

+1 ভাল উত্তর, প্লাস আমি কখনই SECONDS সম্পর্কে জানতাম না।
মাইকেল

এটি কাজ করে, তবে এটি 'ঘুম .5' কে পরীক্ষিত সময়-লুপ শর্ত হিসাবে দেখতে কিছুটা অদ্ভুত লাগে .. যতক্ষণ না আমি বিশেষত $ সেকেন্ডস ব্যবহার করতে পছন্দ করি কারণ এটি বাস্তব সময়ের সাথে সম্পর্কিত, (অর্থাত্‍ এর মধ্যে একটি স্থির বিচ্ছিন্ন সময় নয়) সময়োপযোগী ক্রিয়াগুলি যেমন ঘুম 1) ... SECONDS শেলটি শুরু হওয়ার পরে এই পরিবর্তনশীলটি সেকেন্ডের সংখ্যাতে প্রসারিত হয়। (সুতরাং আমি সম্ভবত এটি 0 তে সেট করব না .. স্ক্রিপ্টটি শুরু হওয়ার সময় থেকে এটি 60 সেকেন্ডের জন্য আরও পরীক্ষা করুন) .. +1
পিটার.ও

আমি আরও মন্তব্য করছি, কেবলমাত্র আমি ব্যক্তিগতভাবে সঠিক সংশোধন পাওয়ার উপায়ের জন্য আগ্রহী ... আমি $ সেকেন্ড পরীক্ষা করেছি এবং মনে হচ্ছে এটি '0' তে সেট করা আছে বা না এখনও এটি নির্ভর করে সিস্টেমের বর্তমান ভগ্নাংশ দ্বিতীয় .. অর্থাত্। এটি '0' এ সেট করার ফলে 0.99 সময়ের সময় আসতে পারে ... (এটি ঠিক যেমনটি রেখে দেওয়া হয় ঠিক তেমন) .... সুতরাং, এর সেরা গড় সম্ভাবনাটি এক সেকেন্ডের মাত্র .5 এর মধ্যে থাকা। .. মাত্র একটি মন্তব্য (মন্তব্যগুলি এর জন্য :)
পিটার.ও

@ ফ্রেড.বার ভাল, আপনি সত্যই এটি কখনই সঠিক পাবেন না; কাউন্টডাউন চলাকালীন কিছু অন্যান্য প্রক্রিয়া সিপিইউ এবং / অথবা আইওকে হগিং করা শুরু করতে পারে এবং আপনার আগে যে যথার্থতা ছিল তা নষ্ট করে দিতে পারে। আপনি যা করতে পারেন তা হ'ল এটির পক্ষে কমপক্ষে এক্স পরিমাণের জন্য অপেক্ষা করা এবং যদি ইচ্ছা হয় তবে কিছুটা কাউন্টডাউন দেওয়া। যখন কোনও প্রোগ্রাম বলে "এটি এক মিনিট সময় নেবে", আপনি কি মিলিসেকেন্ডে ঠিক 1 মিনিট সময় নেবেন বলে আশা করছেন? বা 1 মিনিট নিতে, দিতে বা কয়েক সেকেন্ড সময় নিতে?
গিরিহা

@ গিরিহা ... হ্যাঁ, এই প্রকরণটি ৯৯% ক্ষেত্রে বিবেচিত হবে না, এবং এর দুর্দান্তটি আপনি আমাকে $ দ্বিতীয় সেকেন্ড সম্পর্কে সচেতন করেছেন ... আমি কেবল তার সীমাবদ্ধতা সন্ধান করছি ... আমি একটি সাথে খেলেছি আপনার স্ক্রিপ্টের প্রকরণ যা .01 সেকেন্ড ঘুমের উপর ভিত্তি করে সমাপ্তির সময় রিপোর্ট করে (প্লাস, আপনি যেমন উল্লেখ করেছেন যে কোনও বাহ্যিক সিস্টেমের পিছনে) এখনও মুদ্রণ হয় যখন দ্বিতীয় বার ক্লিক করা হয়, তবে আমি আবিষ্কার করি প্রথম 'দ্বিতীয়' খুব শীঘ্রই মুদ্রণ করা হয়েছিল (এক ক্ষেত্রে, প্রথম .01 সেকেন্ডের ঠিক পরে) .. এটি আমার বাশ শেখার বক্ররেখার সমস্ত অংশ ... আমি আপনার উত্তরটি পছন্দ করি, এজন্যই আমি এটির আরও গভীর দৃষ্টি আকর্ষণ করেছি।
পিটার.ও

3

\rবা \bপদ্ধতির পাশাপাশি , \033[2K নিয়ন্ত্রণ চরিত্রটি ব্যবহার করা সম্ভব , যা টার্মিনালটিকে পুরো লাইনটি সাফ করতে বলে। এর তুলনায় এর সুবিধাটি \bহ'ল \bআপনি মুছে ফেলতে চান এমন পরিমাণের সাথে আপনার সংখ্যার মিল নেই এবং তুলনায় \rনতুন পংক্তিটি যদি পুরানোের চেয়ে ছোট হয় তবে পর্দায় অক্ষর থাকবে না এক.

নীচে এটি এই প্রশ্নের ক্ষেত্রে কীভাবে প্রয়োগ করা যেতে পারে তার উদাহরণ দেওয়া আছে এবং বুট বার্তাগুলির অনুরূপ আউটপুট তৈরি করতে সম্পর্কিত অ্যাপ্লিকেশনটির একটি উদাহরণ এখানে দেওয়া হল। এই বিশেষ উদাহরণে, টাইমার 0 সেকেন্ডে পৌঁছে একবার চলে যাবে এবং টাইমার লাইনটি "প্রস্তুত!" ফ্রেজ।

#!/bin/bash
sek=60
echo "60 Seconds"

while ((sek--)); do
    printf "One moment please: %d" "$sek"
    sleep 1
    printf "\r%b" "\033[2K"
done
echo "Ready!"

আর একটি বিকল্প dialogহ'ল কমান্ড-লাইনে সরল সংলাপ তৈরি করার জন্য কমান্ড নিয়োগ করা । ডায়ালগটি টাইমার সময়কালের জন্য এবং লুপের সাথে আপডেট হওয়ার জন্য স্ক্রিনে থাকবে এবং এটি শেষ হওয়ার সাথে সাথে - টাইমারটি "নির্বিঘ্নে প্রস্তুত! প্রস্থান করার জন্য টিপুন" বার্তাটি নির্বিঘ্নে প্রতিস্থাপন করা হবে:

#!/bin/bash
sek=60
echo "60 Seconds"

while ((sek--)); do
    echo "$sek" | dialog --progressbox "Please wait" 10 25
    sleep 1
done
dialog --msgbox "Ready! Press <OK> to finish" 10 25

dialogম্যাকটিতে উপস্থিত নেই: /
রিকি লেভি

1

এখানে এবং আরও কিছুটা পড়ার পরে আমি এই বিষয়টি নিয়ে এসেছি, একটি লাইনার:

SEC=101;for i in `seq $SEC -1 1`;do printf "\rNext in: %`expr length $SEC`ds" "$i";sleep 1;done;echo

আরও পঠনযোগ্য:

#!/bin/bash
SEC=101

for i in `seq $SEC -1 1`;do
        printf "\rNext in: %`expr length $SEC`ds" "$i";
        sleep 1;
done
echo

যেখানে এসইসিটি ইতিবাচক পূর্ণসংখ্যায় সেট করা যেতে পারে এবং প্রিন্টফ উপযুক্ত প্যাডিংয়ের যত্ন নেবে। উবুন্টু এবং সাইগউইনের অধীনে পরীক্ষিত।


1

গাড়ীর রিটার্ন রেখে এটি অর্জন করতে পারে \r

কোডের একক লাইনে এটি দিয়ে সম্ভব echo -ne

for i in {60..1}; do echo -ne "One moment please: $i\r" && sleep 1; done

বা সাথে printf

for i in {60..1}; do printf "One moment please: $i\r" && sleep 1; done

-2

কাউন্টডাউন টাইমার:

MIN=1 && for i in $(seq $(($MIN*60)) -1 1); do echo -n "$i, "; sleep 1; done; echo -e "nnMessage"

এবং 'সাধারণ' স্টপওয়াচটি হ'ল:

START=$( date +%s ); while true; do CURRENT=$( date +%s ) ; echo $(( CURRENT-START )) ; sleep 1 ; echo -n  ; done

থামাতে + সি নিয়ন্ত্রণ করুন


এটি পাঠ্য ওভাররাইটিং সম্পর্কে প্রশ্নের উত্তর দেয় না
জেরেমি কের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.