এই কমান্ডটি শেলটি 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 দ্বারা অনুপ্রাণিত অপারেটরperl
s 'এর1..5000
এক এবং পরে ksh93 এবং ব্যাশ দ্বারা অনুলিপি করেছে)