একই লাইনে প্রতিধ্বনি কীভাবে দেখানো এবং আপডেট করা যায়


112

আমার নীচে বাশ (লিনাক্স) এ রয়েছে

for dir in Movies/*
do
  (cd "$dir" && pwd|cut -d \/ -f5|tr -s '\n' ', ' >> ../../movielist &&
  exiftool * -t -s3 -ImageSize -FileType|tr -s '\t' ',' >> ../../movielist )
echo "Movie $movies - $dir ADDED!"
let movies=movies+1
done

তবে আমি এটি তৈরি করতে চাই যাতে "প্রতিধ্বনি" পরবর্তী লাইনে নিম্নলিখিত প্রতিধ্বনিকে দেখায় (শেষ প্রতিধ্বনির সাথে সামঞ্জস্য করে না তবে এটি প্রতিস্থাপন করে) যাতে এটি আপডেট হওয়ার মতো দেখায়। শতাংশ সহ একটি অগ্রগতি বার একই লাইনে কীভাবে প্রদর্শিত হবে তার অনুরূপ।

উত্তর:


196

আচ্ছা আমি এর man echoজন্য পৃষ্ঠাটি সঠিকভাবে পড়িনি ।

প্রতিধ্বনিতে 2 টি বিকল্প রয়েছে যা আমি যদি 3 য় পলায়ন চরিত্র যুক্ত করি তবে এটি করতে পারে।

2 বিকল্পগুলি -nএবং -e

-nট্রেলিং করা নতুন লাইন আউটপুট দেবে না। যাতে প্রতিবার আমি কিছু প্রতিধ্বনিত করি তখন আমাকে নতুন লাইনে যাওয়ার থেকে বাঁচায়।

-e আমাকে ব্যাকস্ল্যাশ পালানোর প্রতীকগুলি ব্যাখ্যা করার অনুমতি দেবে।

কি অনুমান পালাবার প্রতীক আমি এই জন্য ব্যবহার করতে চান: \r। হ্যাঁ, ক্যারেজ রিটার্নটি আমাকে আবার প্রেরণে প্রেরণ করত এবং দৃষ্টিভঙ্গি দেখায় যে আমি একই লাইনে আপডেট করছি।

সুতরাং ইকো লাইনটি দেখতে এটির মতো হবে:

echo -ne "Movie $movies - $dir ADDED!"\\r

আমাকে পালানোর প্রতীকটি থেকে বাঁচতে হয়েছিল যাতে বাশ এটি হত্যা না করে। এজন্য আপনি \সেখানে 2 টি চিহ্ন দেখেন ।

উইলিয়াম দ্বারা উল্লিখিত হিসাবে, printfএই জাতীয় অনুরূপ (এবং আরও বিস্তৃত) কাজও করতে পারে।


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

8
printf a; printf bআউটপুট ab--- printf a\\r; printf bআউটপুট b--- printf a\\r; sleep 1; printf bআউটপুট a, তারপরb
XavierStuvw

64

যদি আমি ভালভাবে বুঝতে পারি তবে আপনি এটি নীচের লাইনের সাথে আপনার প্রতিধ্বনিকে প্রতিস্থাপন করতে পারেন:

echo -ne "Movie $movies - $dir ADDED! \033[0K\r"

এটির একটি ছোট উদাহরণ যা আপনি এর আচরণটি বোঝার জন্য চালাতে পারেন:

#!/bin/bash
for pc in $(seq 1 100); do
    echo -ne "$pc%\033[0K\r"
    sleep 1
done
echo

এটি প্রদর্শিত হয় যে zsh এ Kএটি প্রয়োজনীয় নয় এবং প্রকৃতপক্ষে চিঠিটি কে হিসাবে
প্রকাশিত হয়েছে

1
দুর্দান্ত উদাহরণ - আমার জন্য শুরুতে হ্যাশ ব্যাং কী ছিল
ফেলিক্স ইভ

22

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

তাই আমি আপনাদের সাথে একটি উদাহরণ ভাগ করে নিতে চাই। নিম্নলিখিত স্ক্রিপ্টটি একটি CentOS সিস্টেমে চেষ্টা করা হয়েছিল এবং "টাইমডেটেক্টল" কমান্ড ব্যবহার করে যা মূলত আপনার সিস্টেমের কিছু বিশদ সময় তথ্য মুদ্রণ করে।

আমি এই আদেশটি ব্যবহার করার সিদ্ধান্ত নিয়েছি কারণ এর আউটপুটে একাধিক লাইন রয়েছে এবং নীচের উদাহরণের জন্য নিখুঁতভাবে কাজ করে:

#!/bin/bash
while true; do
  COMMAND=$(timedatectl) #Save command result in a var.
  echo "$COMMAND" #Print command result, including new lines.

  sleep 3 #Keep above's output on screen during 3 seconds before clearing it

  #Following code clears previously printed lines
  LINES=$(echo "$COMMAND" | wc -l) #Calculate number of lines for the output previously printed
  for (( i=1; i <= $(($LINES)); i++ ));do #For each line printed as a result of "timedatectl"
    tput cuu1 #Move cursor up by one line
    tput el #Clear the line
  done

done

উপরেরগুলি timedatectlচিরকাল " " এর ফলাফল মুদ্রণ করবে এবং পূর্ববর্তী প্রতিধ্বনিকে আপডেট ফলাফলের সাথে প্রতিস্থাপন করবে।

আমাকে উল্লেখ করতে হবে যে এই কোডটি কেবল একটি উদাহরণ, তবে আপনার প্রয়োজনের উপর নির্ভর করে আপনার জন্য সেরা সমাধান নয়। অনুরূপ একটি কমান্ড যা প্রায় একই কাজ করবে (কমপক্ষে দৃশ্যত) " watch -n 3 timedatectl"।

তবে এটি আলাদা গল্প। :)

আশা করি এইটি কাজ করবে!


3

এটি বিভিন্নভাবে কার্যকর দরকারী এটি চেষ্টা করুন এবং প্রয়োজনীয় হিসাবে পরিবর্তন করুন।

#! bin/bash
for load in $(seq 1 100); do
    echo -ne "$load % downloded ...\r"
    sleep 1
done
echo "100"
echo "Loaded ..."

3

আপনি এটি চেষ্টা করতে পারেন .. এটির নিজস্ব সংস্করণ ..

funcc() {
while true ; do 
for i in \| \/ \- \\ \| \/ \- \\; do 
  echo -n -e "\r$1  $i  "
sleep 0.5
done  
#echo -e "\r                                                                                      "
[ -f /tmp/print-stat ] && break 2
done
}

funcc "Checking Kubectl" & &>/dev/null
sleep 5
touch /tmp/print-stat
echo -e "\rPrint Success                  "

1

আমার প্রিয় উপায় বলা হয় 50. এখানে ঘুম না iপরিবর্তনশীল প্রতিধ্বনি বিবৃতি ভিতরে ব্যবহৃত করা প্রয়োজন।

for i in $(seq 1 50); do
  echo -ne "$i%\033[0K\r"
  sleep 50
done
echo "ended"

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