আমি এইরকম যে একটি একক যুক্তি সর্বাধিক দৈর্ঘ্য না এখানে সমস্যা এত প্লাস সামগ্রিক যুক্তি অ্যারের মোট আকার পরিবেশ, যা সীমাবদ্ধ আয়তন ছিল অধীন ছিল ARG_MAX
। সুতরাং আমি ভেবেছিলাম যে নিম্নলিখিতগুলির মতো কিছু সফল হবে:
env_size=$(cat /proc/$$/environ | wc -c)
(( arg_size = $(getconf ARG_MAX) - $env_size - 100 ))
/bin/echo $(tr -dc [:alnum:] </dev/urandom | head -c $arg_size) >/dev/null
সঙ্গে - 100
শেল এবং পরিবেশ আকার মধ্যে পার্থক্য জন্য অ্যাকাউন্টে চেয়ে বেশি যথেষ্ট হচ্ছে echo
প্রক্রিয়া। পরিবর্তে আমি ত্রুটি পেয়েছি:
bash: /bin/echo: Argument list too long
কিছুক্ষণ ঘোরাঘুরি করার পরে, আমি দেখতে পেলাম যে সর্বাধিকটি হ'ল আকারের পূর্ণ হেক্স অর্ডার ছিল:
/bin/echo \
$(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \
>/dev/null
বিয়োগটি সরানো হলে ত্রুটি ফিরে আসে। আপাতদৃষ্টিতে একটি একক আর্গুমেন্টের সর্বাধিক হ'ল ARG_MAX/16
এবং -1
আর্গুমেন্ট অ্যারেতে স্ট্রিংয়ের শেষে নাল বাইটের অ্যাকাউন্টগুলি।
আর একটি বিষয় হ'ল যুক্তিটি পুনরাবৃত্তি করা হলে আর্গুমেন্ট অ্যারের মোট আকার আরও কাছাকাছি হতে পারে ARG_MAX
তবে এখনও সেখানে যথেষ্ট নয়:
args=( $(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) )
for x in {1..14}; do
args+=( ${args[0]} )
done
/bin/echo "${args[@]}" "${args[0]:6534}" >/dev/null
"${args[0]:6533}"
এখানে ব্যবহার করা শেষ যুক্তিটি 1 বাইট দীর্ঘায়িত করে এবং Argument list too long
ত্রুটি দেয় । এই পার্থক্যটি প্রদত্ত পরিবেশের আকার অনুসারে গণ্য হওয়ার সম্ভাবনা কম:
$ cat /proc/$$/environ | wc -c
1045
প্রশ্নাবলী:
- এই সঠিক আচরণ, বা কোথাও একটি বাগ আছে?
- তা না হলে এই আচরণটি কি কোথাও নথিবদ্ধ? অন্য কোন প্যারামিটার আছে যা একক যুক্তির জন্য সর্বাধিক সংজ্ঞা দেয়?
- এই আচরণটি কি লিনাক্সের মধ্যে সীমাবদ্ধ?
- আর্গুমেন্ট অ্যারের প্রকৃত সর্বোচ্চ আকার প্লাস এবং পরিবেশের আনুমানিক আকারের মধ্যে অতিরিক্ত ~ 5KB বৈষম্যের জন্য কী
ARG_MAX
?
অতিরিক্ত তথ্য:
uname -a
Linux graeme-rock 3.13-1-amd64 #1 SMP Debian 3.13.5-1 (2014-03-04) x86_64 GNU/Linux
getconf ARG_MAX
উপর নির্ভর করে ulimit -s
। এটি সীমাহীনতে সেট করুন এবং ARG_MAX এর জন্য একটি আশ্চর্যজনক 4611686018427387903 পান।