অনুরূপ কিছু দেখা যায় নি এবং এখানে সমস্ত কাস্টম ফাংশন একাই রেন্ডারিংয়ে ফোকাস করছে বলে মনে হচ্ছে ... নীচে আমার খুব সাধারণ পসিক্স অনুগত সমাধানটি ধাপে ধাপে ব্যাখ্যা সহকারে এই প্রশ্নটি তুচ্ছ নয়।
টি এল; ডিআর
অগ্রগতি বারটি সরবরাহ করা খুব সহজ। এর কতটা রেন্ডার করা উচিত তা অনুমান করা ভিন্ন বিষয়। অগ্রগতি বারটি কীভাবে রেন্ডার (অ্যানিমেট করা যায়) - আপনি কোনও ফাইলের মধ্যে এই উদাহরণটি অনুলিপি করে আটকে দিতে পারেন:
#!/bin/sh
BAR='####################' # this is full bar, e.g. 20 chars
for i in {1..20}; do
echo -ne "\r${BAR:0:$i}" # print $i chars of $BAR from 0 position
sleep .1 # wait 100ms between "frames"
done
{1..20}
- 1 থেকে 20 পর্যন্ত মান
echo -n
- শেষে নতুন লাইন ছাড়া মুদ্রণ করুন
echo -e
- মুদ্রণের সময় বিশেষ অক্ষর ব্যাখ্যা করুন
"\r"
- ক্যারেজ রিটার্ন, লাইনের শুরুতে ফিরে আসার জন্য একটি বিশেষ চর
আপনি যেকোন গতিতে যেকোন বিষয়বস্তু রেন্ডার করতে পারেন যাতে এই পদ্ধতিটি খুব সার্বজনীন, যেমন প্রায়শই বোকা সিনেমাগুলিতে "হ্যাকিং" এর দৃশ্যধারণের জন্য ব্যবহৃত হয়, মজা করা যায় না।
পুরো উত্তর
সমস্যার মাংসটি হ'ল $i
মান নির্ধারণ করতে হয়, অর্থাত কত অগ্রগতি বার প্রদর্শন করা যায়। উপরের উদাহরণে আমি কেবল for
নীতিটি বর্ণনা করতে এটি লুপে বৃদ্ধি করতে দিয়েছি তবে একটি বাস্তব জীবনের অ্যাপ্লিকেশন একটি অসীম লুপ ব্যবহার করবে এবং $i
প্রতিটি পুনরাবৃত্তির উপর চলক গণনা করবে । গণনা করার জন্য এটি নিম্নলিখিত উপাদানগুলির প্রয়োজন:
- কত কাজ আছে
- এখন পর্যন্ত কত কাজ হয়েছে
এর ক্ষেত্রে cp
কোনও উত্স ফাইলের আকার এবং টার্গেট ফাইলের আকার প্রয়োজন:
#!/bin/sh
$src=/path/to/source/file
$tgt=/path/to/target/file
cp "$src" "$tgt" & # the & forks the `cp` process so the rest
# of the code runs without waiting (async)
BAR='####################'
src_size=$(stat -c%s "$src") # how much there is to do
while true; do
tgt_size=$(stat -c%s "$tgt") # how much has been done so far
i=$(( $tgt_size * 20 / $src_size ))
echo -ne "\r${BAR:0:$i}"
if [ $tgt_size == $src_size ]; then
echo "" # add a new line at the end
break; # break the loop
fi
sleep .1
done
stat
- ফাইলের পরিসংখ্যান পরীক্ষা করুন
-c
- ফর্ম্যাট মানটি ফেরত দিন
%s
- মোট আকার
ফাইল আনপ্যাকিংয়ের মতো ক্রিয়াকলাপগুলির ক্ষেত্রে, উত্সের আকার গণনা করা আরও কিছুটা কঠিন তবে একটি সঙ্কুচিত ফাইলের আকার পাওয়ার মতো এখনও সহজ:
#!/bin/sh
src_size=$(gzip -l "$src" | tail -n1 | tr -s ' ' | cut -d' ' -f3)
gzip -l
- জিপ সংরক্ষণাগার সম্পর্কে তথ্য প্রদর্শন করুন
tail -n1
- নীচ থেকে 1 লাইন দিয়ে কাজ করুন
tr -s ' '
- একাধিক স্পেস অনুবাদ করুন (সেগুলি বার করুন)
cut -d' ' -f3
- তৃতীয় স্পেস-সীমাবদ্ধ কলাম কাটুন
যদিও সমস্যার মাংস এখানে। এই দ্রবণটি কম এবং কম সাধারণ। প্রকৃত অগ্রগতির সমস্ত গণনা আপনি যে ডোমেনটি ভিজ্যুয়ালাইজ করার চেষ্টা করছেন তার সাথে দৃ bound়ভাবে আবদ্ধ, এটি কি কোনও একক ফাইল অপারেশন, টাইমার কাউন্টডাউন, ডিরেক্টরিতে ফাইলের সংখ্যা বৃদ্ধি, একাধিক ফাইলের ক্রিয়াকলাপ ইত্যাদি, তাই, এটি পুনরায় ব্যবহার করা যাবে না। একমাত্র পুনরায় ব্যবহারযোগ্য অংশটি অগ্রগতি বার রেন্ডারিং। এটির পুনঃব্যবহার করতে আপনাকে এটিকে বিমূর্ত করতে হবে এবং একটি ফাইল (যেমন /usr/lib/progress_bar.sh
) সংরক্ষণ করতে হবে , তারপরে এমন ফাংশনগুলি সংজ্ঞায়িত করুন যা আপনার ডোমেনের সাথে নির্দিষ্ট ইনপুট মান গণনা করে। এটি একটি সাধারণ কোডটি দেখতে কেমন লাগে (আমি এটিও $BAR
গতিশীল করেছিলাম কারণ লোকেরা এটি চাচ্ছিল, বাকিটি এখনই পরিষ্কার হওয়া উচিত):
#!/bin/sh
BAR_length=50
BAR_character='#'
BAR=$(printf "%${BAR_length}s" | tr ' ' $BAR_character)
work_todo=$(get_work_todo) # how much there is to do
while true; do
work_done=$(get_work_done) # how much has been done so far
i=$(( $work_done * $BAR_length / $work_todo ))
echo -ne "\r${BAR:0:$i}"
if [ $work_done == $work_todo ]; then
echo ""
break;
fi
sleep .1
done
printf
- প্রদত্ত বিন্যাসে স্টাফ মুদ্রণের জন্য একটি বিল্টিন
printf '%50s'
- কিছুই মুদ্রণ করুন, এটি 50 স্পেস দিয়ে প্যাড করুন
tr ' ' '#'
- প্রতিটি স্থান হ্যাশ সাইন অনুবাদ করুন
এবং আপনি এটি ব্যবহার করতে চান:
#!/bin/sh
src=/path/to/source/file
tgt=/path/to/target/file
function get_work_todo() {
echo $(stat -c%s "$src")
}
function get_work_done() {
[ -e "$tgt" ] && # if target file exists
echo $(stat -c%s "$tgt") || # echo its size, else
echo 0 # echo zero
}
cp "$src" "$tgt" & # copy in the background
source /usr/lib/progress_bar.sh # execute the progress bar
স্পষ্টতই এটি কোনও ফাংশনে আবৃত হতে পারে, পাইপযুক্ত স্ট্রিমগুলির সাথে কাজ করতে পুনরায় লিখিত, অন্য ভাষায় লিখিত, আপনার বিষ যাই হোক না কেন।