এই কমান্ডটি শেলটি 5000 টি আর্গুমেন্ট উত্পন্ন করার উপর নির্ভর করে এবং এগুলিতে printfযা পরে তা অগ্রাহ্য করে। যদিও এটি বেশ দ্রুত মনে হতে পারে - এবং কিছু জিনিসের সাথে তুলনামূলক - শেলটি এখনও সেই সমস্ত স্ট্রিংকে আর্গ (এবং সেগুলি সীমান্তে) হিসাবে তৈরি করতে হবে এবং আরও অনেক কিছু।
শেলটি প্রথম 5000 এর পুনরাবৃত্তি না হওয়া পর্যন্ত উত্পন্ন এইচএস মুদ্রণ করা যায় না, এই কমান্ডটি এইচএস এর printf সাথে সংখ্যার স্ট্রিং আর্গুমেন্টগুলি সংরক্ষণ এবং সীমিত করতে সমস্ত মেমরির জন্যও ব্যয় করে । ঠিক যেমন আপনি করতে পারেন:
printf %05000s|tr \ H
... যা 5000 টি স্পেসের একটি স্ট্রিং উত্পন্ন করে - যা সাধারণত কমপক্ষে কেবলমাত্র একক বাইট হয় এবং সীমানা ছাড়াই দাম ব্যয় করার জন্য কিছুই লাগে না। কয়েকটি পরীক্ষা নির্দেশ করে যে কাঁটাচামচের জন্য 5000 বাইটের জন্য এমনকি পাইপগুলির জন্য প্রয়োজনীয় trমূল্য এমনকি এই ক্ষেত্রে এমনকি এটি মূল্যবান এবং এটি যখন সংখ্যাটি বেশি হয় তখন প্রায় সর্বদা এটি হয়।
আমি দৌড়ে ...
time bash -c 'printf H%.0s {1..5000}' >/dev/null
...এবং...
time bash -c 'printf %05000s|tr \ H' >/dev/null
প্রতিটি প্রায় 5 বার একটি টুকরো (এখানে বৈজ্ঞানিক কিছুই নেই - কেবলমাত্র উপাখ্যানীয়) এবং ব্রেস সম্প্রসারণ সংস্করণ মোট প্রক্রিয়াকরণের সময়কালে .02 সেকেন্ডের চেয়ে একটু বেশি পেরিয়ে গেছে, তবে trসংস্করণটি গড়ে প্রায় .012 সেকেন্ডে এসেছিল - এবং trসংস্করণটি এটি পরাজিত করে প্রত্যেকবার. আমি অবাক হয়ে বলতে পারি না - {brace expansion}এটি একটি কার্যকর ইন্টারেক্টিভ শেল শর্টহ্যান্ড বৈশিষ্ট্য, তবে যেখানে কোনও ধরণের স্ক্রিপ্টিং সম্পর্কিত তা করার জন্য এটি সাধারণত একটি অপব্যয়ী জিনিস। সাধারণ ফর্ম:
for i in {[num]..[num]}; do ...
... যখন আপনি এটি সম্পর্কে চিন্তা, সত্যিই দুই for প্রথম অভ্যন্তরীণ ও যে কোনো না কোনোভাবে শেল আবশ্যক লুপ তাদের সবাইকে সংরক্ষণ এবং সেগুলি আপনার জন্য আবার iterating পূর্ববর্তীদের iterators উৎপন্ন করার জন্য উহ্য হয় - লুপ forলুপ। এই জাতীয় জিনিসগুলি সাধারণত ভালভাবে করা হয়:
iterator=$start
until [ "$((iterator+=interval))" -gt "$end" ]; do ...
... কারণ আপনি কেবলমাত্র খুব কম মান সংরক্ষণ করেন এবং পুনরাবৃত্তিগুলি তৈরি করার সময় পুনরাবৃত্তি করার পাশাপাশি সেগুলি ওভাররাইট করে।
যাইহোক, পূর্বে উল্লিখিত স্পেস প্যাডিংয়ের মতো, আপনি printfএকটি স্বেচ্ছাসেবী সংখ্যাও জিরোপ্যাড করতে ব্যবহার করতে পারেন , অবশ্যই:
printf %05000d
আমি উভয় যুক্তি ছাড়াই করি কারণ আর্গুমেন্টের printfফর্ম্যাট স্ট্রিংয়ে নির্দিষ্ট প্রতিটি আর্গুমেন্টের জন্য যখন কোনও আর্গুমেন্ট নাল স্ট্রিং ব্যবহার করা হয় না - যা কোনও অঙ্কের আর্গুমেন্টের জন্য শূন্য বা স্ট্রিংয়ের জন্য খালি স্ট্রিং হিসাবে ব্যাখ্যা করা হয়।
প্রশ্নের কমান্ডের সাথে তুলনা করার সময় এটি মুদ্রার অপর (এবং - আমার মতে - আরও দক্ষ) দিক - যখন আপনি printf %.0প্রতিটি যুক্তির জন্য স্ট্রিংয়ের দৈর্ঘ্য করেন তখন আপনি যেমন কিছু করেন তেমন কিছুই পাওয়া সম্ভব না , তাই এটিও হয় কিছুই থেকে কিছু পাওয়া সম্ভব।
আপনি ddযেমন ব্যবহার করতে পারেন প্রচুর পরিমাণে জেনারেট বাইটের জন্য দ্রুততর :
printf \\0| dd bs=64k conv=sync
... এবং W / নিয়মিত ফাইল ddএর seek=[num]যুক্তি বৃহত্তর সুবিধা ব্যবহার করা যাবে। আপনি NULLs বদলে 64K নতুন লাইন পেতে পারেন যদি আপনি যোগ ,unblock cbs=1উপরে এবং থেকে সঙ্গে প্রতি লাইনে নির্বিচারে স্ট্রিং সেখানে উদ্বুদ্ধ পারে pasteএবং /dev/null- কিন্তু যে ক্ষেত্রে, যদি আপনার কাছে উপলব্ধ হয়, তাহলে আপনি হিসাবে ভাল ব্যবহার করতে পারেন:
yes 'output string forever'
ddযাইহোক এখানে আরও কয়েকটি উদাহরণ দেওয়া হল :
dd bs=5000 seek=1 if=/dev/null of=./H.txt
... যা 5000 টি বাইটের আকারের H.txt নামের বর্তমান ডিরেক্টরিতে একটি পূর্ণ ফাইল তৈরি করে (বা\0NUL ছাঁটাই করে)। ddসরাসরি অফসেটে সন্ধান করে এবং এর পিছনে NUL পূরণ করে।
<&1 dd bs=5000 conv=sync,noerror count=1 | tr \\0 H >./H.txt
... যা একই নাম এবং আকারের একটি ফাইল তৈরি করে তবে ডাব্লু / এইচ চর পূরণ করে। এটা তোলে সুবিধা নেয় ddএকটি পঠিত ত্রুটির ক্ষেত্রে অন্তত একটি পূর্ণ নাল-ব্লক আউট লেখার এর spec'd আচরণ যখন noerrorএবং syncধর্মান্তর উল্লিখিত (এবং - ছাড়া count=- সম্ভবত চেয়ে যদি আপনি চান পারে আর যেতে হবে) , এবং ইচ্ছাকৃতভাবে পুনঃনির্দেশ এ writeonly ফাইল বর্ণনাকারী ddএর stdin।
tcshবাzsh,repeat 5000 printf Hবুঝতে সহজ। সঙ্গেperl:print "H" x 5000(নোট যে{1..5000}একটি zsh দ্বারা অনুপ্রাণিত অপারেটরperls 'এর1..5000এক এবং পরে ksh93 এবং ব্যাশ দ্বারা অনুলিপি করেছে)