একটি নতুন লেখার বিরোধিতা করে টার্মিনালে একটি রেখার বিষয়বস্তু কীভাবে পরিবর্তন করবেন?


24

সুতরাং, যখন wgetকোনও ওয়েব পৃষ্ঠা পাওয়া যায়, এটি আপনাকে একটি স্ট্যাটাস বার দেখায় যা ফাইল (গুলি) কতটা ডাউনলোড হয় / তা ডাউনলোড করে। দেখে মনে হচ্ছে:

25%[=============>______________________________________] 25,000 100.0K/s (আন্ডারস্কোরগুলি স্পেস হয়; আমি সেখানে কীভাবে একের পর এক আরও বেশি স্থান পাব তা আমি ঠিক বুঝতে পারি না)

তবে স্টাডাউটে অন্য লাইনটি লেখার পরিবর্তে এবং আরও একটি অগ্রগতি বার যুক্ত করার পরিবর্তে এটি এটি আপডেট করে:

50%[===========================>________________________] 50,000 100.0K/s

এবং wgetএটির একমাত্র উদাহরণ নয়। উদাহরণস্বরূপ, আপনি যখন lessকোনও কিছু পাইপ করেন এবং প্রস্থান করেন তখন আপনার আসল প্রম্পটটি সেখানে উপস্থিত রয়েছে, আপনি যে কমান্ডগুলি আগে চালিয়েছিলেন তার ফলাফল সহ। এ যেন তুমি কখনও ছাড়েনি left

সুতরাং, আমার প্রশ্নগুলি হ'ল এটিকে কী বলা হয়, আমি কীভাবে এটি বাস্তবায়ন করব, এটি কি একবারে কেবল একটি এক লাইনের জন্য কাজ করে, এবং আমি এটি সিতে ব্যবহার করতে পারি?


5
আমি বাশফ্যাউ 44 পড়ার পরামর্শ দিই । আপনি এটি আকর্ষণীয় মনে হতে পারে।
jw013

উত্তর:


32

আপনার প্রশ্নের প্রথমত বাশার সাথে টার্মিনালের সাথে কিছুই করার নেই। টার্মিনাল প্রোগ্রামগুলির পাঠ্য প্রদর্শন করার জন্য প্রতিক্রিয়া জানাচ্ছে এবং প্রোগ্রামগুলি চালু করার পরে বাশ নিজেই কোনও নিয়ন্ত্রণ রাখে না।

টার্মিনালগুলি রঙ, ফন্ট, কার্সার অবস্থান এবং আরও অনেক কিছু নিয়ন্ত্রণ করতে নিয়ন্ত্রণ সিকোয়েন্স সরবরাহ করে। স্ট্যান্ডার্ডাইজড টার্মিনাল ক্রমের তালিকার জন্য http://www.termsys.demon.co.uk/vtansi.htm দেখুন have উদাহরণস্বরূপ

  • লাইনের শুরুতে কার্সারটি অবস্থান করুন
  • এরপরে লাইনটি মুছুন
  • একটি নতুন লাইন লিখুন

একটি অগ্রগতি বার তৈরি করতে।

আরও উন্নত টার্মিনাল এস্কেপ সিকোয়েন্সগুলি সাধারণত টার্মিনাল নির্ভর, যেমন কেবল ইটার্ম বা এক্সটার্মের সাথে কাজ করে। ncurses - এমন একটি প্রোগ্রামিং লাইব্রেরি যা টার্মিনালের সাথে ইন্টারেক্টিভ প্রোগ্রামগুলি তৈরি করে যাতে আপনাকে এস্কেপ সিকোয়েন্সগুলি ব্যবহার করতে হবে না।

টার্মিনাল সিকোয়েন্সগুলির সাথে কীভাবে একটি বিদ্যমান লাইনটি ওভাররাইট করা যায়

echo long text
sleep 1
printf "\033[1A"  # move cursor one line up
printf "\033[K"   # delete till end of line
echo foo

টার্মিনাল ক্রম ছাড়াই কীভাবে বিদ্যমান লাইনটি ওভাররাইট করা যায়

একটি সহজ সমাধান হ'ল শেষে একটি নতুন লাইন না লিখলেও ক্যারেজ রিটার্ন লিখুন যা মূলত লাইনটির শুরুতে কার্সারটিকে পুনরায় সেট করে, যেমন:

echo -n first 
sleep 1 
echo -ne "\rsecond"
echo

\rঅথবা গাড়ি ফেরত লাইনের শুরুতে কার্সার রাখুন এবং আপনি লাইন বিষয়বস্তু ওভাররাইট করতে পারবেন হবে।

বাফারের মতো lessবা এর মধ্যে স্যুইচ করুনvi

এর আচরণটি lessআরও উন্নত টার্মিনাল বৈশিষ্ট্যের কারণে, বিকল্প স্ক্রিনের কারণেও হয়:

ভিটি 102 মোডে, বিকল্প স্ক্রিন বাফারটি সক্রিয় এবং নিষ্ক্রিয় করার জন্য এস্কেপ সিকোয়েন্স রয়েছে, যা উইন্ডোর প্রদর্শনের ক্ষেত্রের সমান আকার। সক্রিয় করা হলে, বর্তমান স্ক্রিনটি সংরক্ষণ করা হয় এবং বিকল্প স্ক্রিনের সাথে প্রতিস্থাপন করা হয়। সাধারণ স্ক্রিনটি পুনরুদ্ধার না হওয়া পর্যন্ত উইন্ডোটির শীর্ষে স্ক্রল করা লাইনগুলিকে অক্ষম করা হবে। এক্সটার্মের জন্য টার্ম ক্যাপ (5) এন্ট্রি ভিজ্যুয়াল এডিটর vi (1) সম্পাদনা করার জন্য এবং প্রস্থান করার সময় স্ক্রিনটি পুনরুদ্ধার করার জন্য বিকল্প স্ক্রিনে স্যুইচ করতে দেয়। একটি পপআপ মেনু এন্ট্রি কাট এবং পেস্টের জন্য সাধারণ এবং বিকল্প স্ক্রিনের মধ্যে স্যুইচ করা সহজ করে তোলে।

http://rosettacode.org/wiki/Terminal_control/Pareserve_screen এটিকে কীভাবে নিজে করতে হয় তার কয়েকটি উদাহরণ তালিকাভুক্ত করে, হয় হয় টিপুট এর মাধ্যমে বা কিছু পালানোর অনুক্রমের মাধ্যমে।


15

echoস্ট্রিংয়ে যা স্বয়ংক্রিয়ভাবে একটি নতুন লাইন যুক্ত করে তা ব্যবহারের পরিবর্তে , ব্যবহার করুন printf "%s\r" whatever- ক্যারেজ রিটার্নটি বর্তমান লাইনের শুরুতে কার্সার প্রেরণ করে। উদাহরণ:

seq 1 15 | while read num; do printf "%2d\r" $num; sleep 1; done; echo ""

আপনার টার্মিনালের কার্সারের উপর নির্ভর করে এটি করা আরও আনন্দদায়ক হতে পারেprintf "\r%2d " $num
glenn jackman
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.