রিয়েল টাইমে কমান্ড দ্বারা লাইন আউটপুটের সংখ্যাটি কীভাবে প্রদর্শিত হবে?


15

আমি svn exportআমার অ্যাপ্লিকেশনটির জন্য একটি প্যাকেজ স্ক্রিপ্টের অংশ হিসাবে ব্যবহার করছি এবং এটি অন্য অনেকের মতো এই কমান্ডের মতো দেখায়, কোনও ধরণের অগ্রগতি বার নেই।

এই মুহূর্তে আমার দুটি পছন্দ আছে:

  • অপশন ছাড়াই এটি ব্যবহার করুন এবং এটি কয়েক হাজার লাইন প্রিন্ট করে দেখুন
  • --quietএটি সম্পূর্ণ না হওয়া অবধি ব্যবহার করে এবং কোনও কিছুই সীল না করে।

কমপক্ষে রিয়েল টাইমে কমপক্ষে লাইন আউটপুট সংখ্যা প্রদর্শন করার কোনও উপায় আছে কি? যেমন:

Exporting SVN directory ... 1234 files

এবং 1234 রিয়েল টাইমে এই সংখ্যা বৃদ্ধি দেখুন ? আমি আউটপুটটি কোনও কমান্ডে পাইপিংয়ের কল্পনা করতে পারি যা কেবল এটি করবে তবে কোনটি?

উত্তর:


16
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

বা বন্ধনী বিভাগ একটি শেল স্ক্রিপ্টে রাখুন। মনে রাখবেন এটি কেবল তখনই কাজ করে যদি আপনার শেলটি প্রকৃতপক্ষে বাশ বা ksh93 বা zsh এর মতো প্রাক-ক্রিয়াকলাপটিকে সমর্থন করে supports অন্যথায় আপনাকে বৃদ্ধি করতে হবে $Iএবং তারপরে এটি মুদ্রণ করতে হবে (যেমন রয়েছে I=$((I+1));printf...)। এছাড়াও, যদি printfআপনার শেলটি দিয়ে কোনও বিল্টিন না থাকে (এটি বর্তমান বাশ সহ একটি বিল্টিন) থাকে তবে আপনি আরও ভাল পারফরম্যান্সের জন্য ব্যবহার করতে পারেন echo -neবা print -nপরিবর্তে। আপনি কেবল নিউলাইনটি দমন করতে চান এবং একটি পালানোর চরিত্র হিসাবে ব্যাখ্যা করা উচিত।


ওহ, আমি কখনই এর সমস্ত কুশ্রী =এবং `=` পার্থক্য এবং তর্ক দিয়ে বাশস্ক্রিপ্টিং শিখতে পারি না । :) কেন তারা এটিকে পাইথনের মতো সিনট্যাক্সযুক্ত ভাষার সাথে প্রতিস্থাপন করবে না ...
বোরিস বুর্কভ

আরে, আমি জানি, কী! আপনি মুদ্রিত প্রতিটি নতুন লাইনে ক্যারেজ রিটার্ন প্রতীক যুক্ত করতে পারেন এবং এটি স্ক্রিনটি প্লাবিত করবে না, এটি কেবল পূর্ববর্তী লাইনটি ওভাররাইট করবে।
বরিস বুর্কভ

printfএক সাথে শেষ হয় কেন \r। এবং যদি আপনি করেন echo -ne "$I\r"বা কি হয় print -n "$I\r"। :) printfতবে আমি ব্যবহার করেছি , কারণ এটি শেষের দিকে একটি নতুন লাইন না ছাপানোর জন্য ডিফল্ট, তাই \rকেবল শুরুতে ফিরে যায়। দুর্ভাগ্যক্রমে সমস্ত প্রতিধ্বনি বাস্তবায়ন -eবা -nযুক্তি সমর্থন করে না ।
dannysauer

1
এটি ওপেনবিএসডি / বিন / শ জন্য ব্যবহৃত পিডিএক্স সংস্করণেও কাজ করে।
কুর্তেম

1
+1 টি, যদিও একেবারে সঠিক হতে চাইলে আমাদের অবশ্যই পরিবর্তন করা উচিত readকাছে read -r(অন্যথায় একটি ব্যাকস্ল্যাশ যেহেতু একটি লাইন শেষে would কাউন্টিং সঙ্গে জগাখিচুড়ি)। ঘটনাচক্রে, কিছুটা কাজ করে, এটি আউটপুটটির সর্বশেষতম লাইনটি দেখানোর জন্যও মানিয়ে নেওয়া যেতে পারে যা কিছু কমান্ডের জন্য কার্যকর হতে পারে।
রুখ 1 ই

7

এটি একটি মোটামুটি ধারণা তবে আপনি pvকমান্ডটি ব্যবহার করতে পারেন লাইনগুলির সংখ্যা গণনা করতে এবং সেগুলি স্ক্রিনে প্রদর্শিত হচ্ছে। pvএর মধ্যে অনেকগুলি স্যুইচগুলির একটি -lসুইচ রয়েছে যা প্রতিটি লাইনের মধ্য দিয়ে যায়।

উদাহরণ

আপনার এসভিএন আউটপুট থেকে কিছু ফাইল অনুকরণ করতে আমি কিছুক্ষণ লুপ ব্যবহার করছি।

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

এটি এভাবে আউটপুট লাইনটি ওভাররাইট করে রাখতে থাকবে:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

আমি পিভি সম্পর্কে অসচেতন ছিলাম। জিনিস শেখার জন্য হুর!
dannysauer

@ উদ্যানসৌয়ের - পিভি কিছুটা শেখার জন্য মূল্যবান, এটি কোনও পাইপের মধ্য দিয়ে যায় এমন কোনও কিছুকে গেজ এবং প্রদর্শন করার অনুমতি দেয়।
slm

আমি মন্তব্যটি পড়ার পরে এটি ইনস্টল করেছি এবং এটির সাথে খেলছি। আঠারো বছর লিনাক্স ব্যবহার করে এবং এখনও সবসময় নতুন জিনিস আবিষ্কার করা যায়। :)
ড্যানিসাউয়ার

0

আপনি আপনার কমান্ডটি ব্যাকগ্রাউন্ডে একটি চাকরি হিসাবে চালাতে পারেন এবং এর স্টাডআউট (এবং স্ট্ডারকে বিকল্পভাবে) একটি লগফাইলে পুনর্নির্দেশ করতে পারেন : command > logfile &যেখানে &চাকরিকে মনোনীত করে (যদি স্ট্যাডারও হয়, &>পরিবর্তে বলুন >)।

তারপরে আপনি আপনার লগফাইলে লাইন সংখ্যা গণনা করতে ওয়ার্ডকাউন্ট ইউটিলিটি ব্যবহার করতে পারেন wc -l

এক পরিবর্তনশীল লাইনে রাষ্ট্রের পরিবর্তন দেখানোর জন্য আপনি এর মতো কিছু ব্যবহার করতে পারেন while true; do echo -en '\r'; wc -l logfile; sleep 1; doneতবে আমি \rআগের লাইনের বিষয়বস্তুগুলিকে মেরে ফেলার জন্য বাশকে গাড়ীর ফেরত আঁকতে বাধ্য করতে পারি না ।

এই প্রশ্নটি দেখুন, এটি প্রায় একটি সদৃশ: /programming/2388090/how-to-delete-and-replace-last-line-in-tter--used-bash


1
তবে তিনি একটি রিয়েল-টাইম প্রদর্শন চান যা বর্ধিত রাখে, যা ডাব্লুসিটি করে না।
কুর্তেম

@ কুর্তাম হ্যা, ড্যানির printf/print/echoপরামর্শ অনুসারে ফলাফলের ফলে তার পর্দা প্লাবিত না হওয়াই তার চেয়ে বেশি কী চায় । :) অবশ্যই, তিনি ব্যবহার করতে পারেন less, তবে আমি মনে করি, তিনি wc -l logfileঅধৈর্য হয়ে ওঠার সময় বলতে পারছেন । আমার মনে হয়, ncursesস্ক্রিনের সাথে খেলা বা সাফ করা এখানে ওভারকিল।
বোরিস বুর্কভ

হ্যাঁ ঠিক. তিনি চান না যে এটি প্লাবিত হোক, তবে তিনি অগ্রগতি জানতে চান, অন্যথায় তিনি কেবল --quiet ব্যবহার করতে পারেন।
কুর্তেম

@ কর্টম আপডেট দেখুন: আপনি আমার echo -e 'r'কমান্ডটি ডিবাগ করতে সহায়তা করতে পারেন ? এটি লাইনের পূর্ববর্তী মুদ্রিত সামগ্রীগুলি মুছে ফেলা উচিত, যাতে এটি পরিবর্তনশীল হয়, তবে আমি এটি করতে বাধ্য করতে পারি না :(
বোরিস বুর্কভ

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