আমি কমান্ড লাইনের স্ক্রিপ্টে একটি ভেরিয়েবল পাস করছি। কমান্ডের চরিত্রের সীমা কত? উদাহরণ:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
ধন্যবাদ।
আমি কমান্ড লাইনের স্ক্রিপ্টে একটি ভেরিয়েবল পাস করছি। কমান্ডের চরিত্রের সীমা কত? উদাহরণ:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
ধন্যবাদ।
উত্তর:
শেল / ওএস আরোপিত সীমাটি সাধারণত খুব দীর্ঘ - সাধারণত এক বা দুই লক্ষ অক্ষর।
getconf ARG_MAX
আপনাকে একটি আদেশের সর্বাধিক ইনপুট সীমা দেবে। ডেবিয়ান সিস্টেমে আমার কাছে বর্তমানে এই রিটার্নে একটি টার্মিনাল খোলা আছে 131072 যা 128 * 1024। সীমাটি আপনার পরিবেশের পরিবর্তনশীলগুলির দ্বারা হ্রাস পেয়েছে যেন আমার স্মৃতি আমাকে সঠিকভাবে পরিবেশন করে তবে এগুলি শেল দ্বারা একই কাঠামোয় পাস করা হয়, যদিও এটি বেশিরভাগ ক্ষেত্রে কেবল কয়েকশ অক্ষরকেই বন্ধ করে দেবে। এই মানটি চালানোর একটি অনুমানের সন্ধান করতে env | wc -c
- এটি এই মেশিনে এই লগইনটিতে বর্তমান সময়ে 325 টি অক্ষর প্রস্তাব করে।
স্ক্রিপ্টগুলি সম্ভবত এই সম্পূর্ণ দৈর্ঘ্যের অনুমতি দেবে, তবে এটি অন্যান্য সম্ভাব্যতাগুলি ইচ্ছাকৃতভাবে বা ডিজাইনের সমস্যাগুলির মাধ্যমে নিজের সীমাবদ্ধতা আরোপ করার সম্ভাবনা নেই। দীর্ঘ কমান্ড লাইনে পৃথক যুক্তি কত দীর্ঘ হতে পারে এবং / অথবা কোনও ফাইলের পথে কত দীর্ঘ হতে পারে তার জন্যও কৃত্রিম সীমা থাকতে পারে।
getconf ARG_MAX
2097152 দেয়, তবে আমি যে সর্বোচ্চ আরগ দৈর্ঘ্যটি পার করতে পারি তা এখনও 131071 (এবং আমাকে পরিবেশের আকার হ্রাস করতে হবে না)।
xargs
এবং এমনকি find -exec
আপনার বন্ধুরাও মনে রাখবেন ।
getconf
দিয়েছি তা কার্নেল স্তরের দ্বারা প্রত্যাবর্তিত মান । সম্ভবত বাশ তার নকশা / কনফিগারেশন দ্বারা একটি নিম্ন সীমা নির্ধারণ করছে? এছাড়াও, আমার এ সম্পর্কে আমার জ্ঞানটি কিছুকাল আগে থেকে এসেছে তাই এটি হতে পারে যে জিনিসগুলি সম্প্রতি সামান্য পরিবর্তিত হয়েছে, যদিও এটি এমন একটি অঞ্চল নয় যা আমি আশা করি নতুন পরীক্ষামূলক শেল বাদে প্রচুর গতিবিধি দেখার আশা করি।
ksh
, zsh
, dash
, fish
এবং ব্যাশ 3 হিসাবে আমি ব্যাশ 4. করেছিল ত্রুটি বার্তা থেকে fish
তথ্যপূর্ণ হতে পারে: "মাছ: যুক্তি ও পরিবেশ তালিকার মোট আকার (130kB) 2.0MB এর অপারেটিং সিস্টেম সীমা ছাড়িয়ে গেছে । " তবে, set | wc -c
306317 এবং env | wc -c
2507 যা পার্থক্যের জন্য অ্যাকাউন্ট করে না। আমি জানি না আর কী গণনা করা হচ্ছে।
এআরজি_এমএক্স প্রকৃতপক্ষে কমান্ড লাইন এবং পরিবেশের মোট আকারকে সীমাবদ্ধ করে, তবে আপনি একটি অতিরিক্ত সীমাবদ্ধতার মুখোমুখি হন: একটি যুক্তি অবশ্যই MAX_ARG_STRLEN এর চেয়ে বেশি হওয়া উচিত নয় (যা দুর্ভাগ্যক্রমে 131072 হ'ল হার্ড-কোডেড)।
Https://unix.stackexchange.com/questions/120642/ what- defines- the- maximum- size- for- a- command- single- argument দেখুন
আপনি দীর্ঘতম পরিবর্তনশীল দৈর্ঘ্য কি বোঝাতে চান? খুব দীর্ঘ ভেরিয়েবলের নামটি তৈরি করতে আপনি পার্লের "এক্স" ব্যবহার করতে পারেন:
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
আমার সিস্টেমে 131071 কাজ করে:
এবং ভেরিয়েবলটি 131072 এ মুদ্রিত হয়েছে এটি খুব বড়:
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
perl
এবং একটি স্ক্রিপ্ট:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
কাজ করে।
printf
শেলটি অন্তর্নির্মিত, তাই অন্য প্রক্রিয়া তৈরির জন্য bash
একটি করার প্রয়োজন নেই exec()
। ARG_MAX
শুধুমাত্র আর্গুমেন্ট তালিকার দৈর্ঘ্য এর কাছে গুরুত্বপূর্ণ exec
(ফাংশন exec()
, execl()
, execlp()
, execvp()
, execvpe()
, ইত্যাদি)।