নিম্নলিখিত শেল কমান্ডটি কেবল ইনপুট স্ট্রিমের বিজোড় লাইনগুলি মুদ্রণ করবে বলে আশা করা হয়েছিল:
echo -e "aaa\nbbb\nccc\nddd\n" | (while true; do head -n 1; head -n 1 >/dev/null; done)
কিন্তু এর পরিবর্তে এটি শুধু প্রথম লাইন ছাপে: aaa
।
যখন এটি -c
( --bytes
) বিকল্পের সাথে ব্যবহৃত হয় তখন একই হয় না :
echo 12345678901234567890 | (while true; do head -c 5; head -c 5 >/dev/null; done)
1234512345
প্রত্যাশা অনুযায়ী এই কমান্ড আউটপুট । তবে এটি কেবল ইউটিলিটির কোর্টিল বাস্তবায়নে কাজ করে head
। , Busybox বাস্তবায়ন এখনও অতিরিক্ত অক্ষর খায় তাই আউটপুট ঠিক হয় 12345
।
আমার ধারণা, বাস্তবায়নের এই নির্দিষ্ট উপায়টি অপ্টিমাইজেশনের উদ্দেশ্যে সম্পন্ন হয়েছে done লাইনটি কোথায় শেষ হবে তা আপনি জানতে পারবেন না, সুতরাং আপনার কত অক্ষর পড়তে হবে তা আপনি জানেন না। ইনপুট স্ট্রিম থেকে অতিরিক্ত অক্ষর না খাওয়ার একমাত্র উপায় হ'ল বাইট দ্বারা স্ট্রিম বাইট পড়া। তবে একবারে এক বাইট স্ট্রিম থেকে পড়া ধীর হতে পারে। সুতরাং আমি অনুমান করি head
যে ইনপুট স্ট্রিমটি যথেষ্ট পরিমাণে বড় বাফারে পড়ে এবং তারপরে সেই বাফারে লাইন গণনা করা হয়।
--bytes
বিকল্পটি যখন ব্যবহৃত হয় তখন ক্ষেত্রে এটির জন্য একই কথা বলা যায় না । এক্ষেত্রে আপনি জানেন কত বাইট আপনার পড়া দরকার। সুতরাং আপনি ঠিক এই সংখ্যাটি বাইটগুলি পড়তে পারেন এবং এর চেয়ে বেশি নয়। Corelibs বাস্তবায়ন এই সুযোগ ব্যবহার করে, কিন্তু , busybox এক না হয়, তাহলে এখনও আরও বাইট চেয়ে একটি বাফার মধ্যে প্রয়োজনীয় সার্চ নেই। এটি সম্ভবত বাস্তবায়নকে সহজ করার জন্য করা হয়েছে।
তাই প্রশ্ন। head
ইনপুট স্ট্রিম থেকে জিজ্ঞাসা করা চেয়ে আরও বেশি অক্ষর গ্রাস করা কি ইউটিলিটির পক্ষে সঠিক ? ইউনিক্স ইউটিলিটিগুলির জন্য কি কোনও ধরণের স্ট্যান্ডার্ড রয়েছে? এবং যদি থাকে তবে এটি কি এই আচরণটি নির্দিষ্ট করে?
পুনশ্চ
Ctrl+C
উপরের কমান্ডগুলি বন্ধ করতে আপনাকে টিপতে হবে। ইউনিক্স ইউটিলিটিগুলি এর বাইরে পড়তে ব্যর্থ হয় না EOF
। আপনি যদি টিপতে না চান তবে আপনি আরও জটিল কমান্ড ব্যবহার করতে পারেন:
echo 12345678901234567890 | (while true; do head -c 5; head -c 5 | [ `wc -c` -eq 0 ] && break >/dev/null; done)
যা আমি সরলতার জন্য ব্যবহার করি নি।