আমি দেখতে পেয়েছি যে এটি "তর্কটি খুব দীর্ঘ" ত্রুটি বাড়িয়ে তুলবে:
ls *.*
এবং এটি এটি উত্থাপন করবে না:
for file in *.*
do
echo $file
done
কেন?
আমি দেখতে পেয়েছি যে এটি "তর্কটি খুব দীর্ঘ" ত্রুটি বাড়িয়ে তুলবে:
ls *.*
এবং এটি এটি উত্থাপন করবে না:
for file in *.*
do
echo $file
done
কেন?
উত্তর:
"আর্গুমেন্ট খুব দীর্ঘ" ত্রুটিটি হ'ল E2BIG, execveসিস্টেম কল দ্বারা উত্থাপিত যদি আর্গুমেন্টগুলির মোট আকার (প্লাস্টিকের পরিবেশ, কিছু সিস্টেমে) খুব বড় হয়। execveকল এক যে বাহ্যিক প্রসেস শুরু বিশেষভাবে একটি ভিন্ন এক্সিকিউটেবল ফাইল লোড হবে (সেখানে একটি ভিন্ন কল, forkএকটি পৃথক প্রক্রিয়া যার কোড একই এক্সিকিউটেবল ফাইল থেকে এখনও চলমান জন্য)। forতাই এটি কলিং সঙ্গে যুক্ত নয় লুপ, একটি অভ্যন্তরীণ শেল কনস্ট্রাক্ট হয় execve। কমান্ডটি ls *.*ত্রুটি উত্থাপন করে যখন গ্লোব প্রসারিত হয় না তবে কখন lsডাকা হয়।
execveE2BIGকমান্ডের কাছে আর্গুমেন্টগুলির মোট আকার ARG_MAX সীমাটির চেয়ে বড় হলে ত্রুটিটি ব্যর্থ হয় । কমান্ডের সাহায্যে আপনি আপনার সিস্টেমে এই সীমাটির মান দেখতে পাবেন getconf ARG_MAX। (আপনার পর্যাপ্ত স্মৃতি থাকলে আপনি এই সীমাটি অতিক্রম করতে পারবেন; ARG_MAXগ্যারান্টির আওতায় রেখে execveযতক্ষণ কোনও সম্পর্কযুক্ত ত্রুটি না ঘটে ততক্ষণ কাজ করবে।)
execveকার্নেল দ্বারা সীমাটি প্রয়োগ করা হয়েছে, এটি সীমাবদ্ধ রাখে কারণ আর্গুমেন্টগুলি এক পর্যায়ে কার্নেল মেমরির মাধ্যমে অনুলিপি করা প্রয়োজন এবং ব্যবহারকারী প্রক্রিয়াগুলি শেল মেমরির একটি নির্বিচার পরিমাণের জন্য অনুরোধ করার অনুমতি দেওয়া যায় না। শেলের ভিতরে, কোনও সীমা থাকার কোনও কারণ নেই, ভার্চুয়াল মেমরির সাথে ফিট করে এমন কোনও কিছুই ঠিক আছে।
আমি মনে করি যে প্রথম উদাহরণটিতে একটি / জুড়ি সিস্টেম কলের মাধ্যমে lsকার্যকর করা হয়েছে, দ্বিতীয়টিতে, সমস্ত কাজ অভ্যন্তরীণ ।bashforkexecbash
execকল সীমা আছে, অভ্যন্তরীণ পরিশ্রমী bash(ভালো বা, বিভিন্ন সীমা সঙ্গে কিছুই করার আছে হয়েছে পরিবর্তে নেই exec, সম্ভবত উপলব্ধ মেমরি পরিমাণ)।
execমধ্যে /usr/include/linux/limits.hসাধারণত হিসাবে সংজ্ঞায়িত করা ARG_MAX।
কারণ lsএটির ক্ষেত্রে একটি যুক্তি, এবং যুক্তির সংখ্যা সীমিত।
forচক্রের ক্ষেত্রে এটি কেবল আইটেমের একটি তালিকা। এর জন্য কোনও সীমা নেই (যতদূর আমি সচেতন)।
for i in {00000001..20000000} ;do ((10#$i==1)) && break; done
/bin/bashবনাম/bin/sh(যা সম্ভবত ড্যাশের লিঙ্ক)?