লিনাক্স কমান্ড লাইন অক্ষরের সীমা


27

আমি কমান্ড লাইনের স্ক্রিপ্টে একটি ভেরিয়েবল পাস করছি। কমান্ডের চরিত্রের সীমা কত? উদাহরণ:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

ধন্যবাদ।


1
আমি প্রশ্ন বুঝতে না. আপনি কি চরিত্রের সীমাতে আগ্রহী?
ক্রিসি

আপনাকে আপনার প্রশ্নটি আরও স্পষ্ট করে বলা দরকার, অন্যথায় এটি বন্ধ হয়ে যাচ্ছে।
ThatGraemeGuy

উত্তর:


27

শেল / ওএস আরোপিত সীমাটি সাধারণত খুব দীর্ঘ - সাধারণত এক বা দুই লক্ষ অক্ষর।

getconf ARG_MAXআপনাকে একটি আদেশের সর্বাধিক ইনপুট সীমা দেবে। ডেবিয়ান সিস্টেমে আমার কাছে বর্তমানে এই রিটার্নে একটি টার্মিনাল খোলা আছে 131072 যা 128 * 1024। সীমাটি আপনার পরিবেশের পরিবর্তনশীলগুলির দ্বারা হ্রাস পেয়েছে যেন আমার স্মৃতি আমাকে সঠিকভাবে পরিবেশন করে তবে এগুলি শেল দ্বারা একই কাঠামোয় পাস করা হয়, যদিও এটি বেশিরভাগ ক্ষেত্রে কেবল কয়েকশ অক্ষরকেই বন্ধ করে দেবে। এই মানটি চালানোর একটি অনুমানের সন্ধান করতে env | wc -c- এটি এই মেশিনে এই লগইনটিতে বর্তমান সময়ে 325 টি অক্ষর প্রস্তাব করে।

স্ক্রিপ্টগুলি সম্ভবত এই সম্পূর্ণ দৈর্ঘ্যের অনুমতি দেবে, তবে এটি অন্যান্য সম্ভাব্যতাগুলি ইচ্ছাকৃতভাবে বা ডিজাইনের সমস্যাগুলির মাধ্যমে নিজের সীমাবদ্ধতা আরোপ করার সম্ভাবনা নেই। দীর্ঘ কমান্ড লাইনে পৃথক যুক্তি কত দীর্ঘ হতে পারে এবং / অথবা কোনও ফাইলের পথে কত দীর্ঘ হতে পারে তার জন্যও কৃত্রিম সীমা থাকতে পারে।


2
আমার সিস্টেমে getconf ARG_MAX2097152 দেয়, তবে আমি যে সর্বোচ্চ আরগ দৈর্ঘ্যটি পার করতে পারি তা এখনও 131071 (এবং আমাকে পরিবেশের আকার হ্রাস করতে হবে না)।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
দৈত্য যুক্তি তালিকার সাথে কাজ করার সময় এটি xargsএবং এমনকি find -execআপনার বন্ধুরাও মনে রাখবেন ।
coredump

@ ডেনিস: আমি যে মূল্য getconfদিয়েছি তা কার্নেল স্তরের দ্বারা প্রত্যাবর্তিত মান । সম্ভবত বাশ তার নকশা / কনফিগারেশন দ্বারা একটি নিম্ন সীমা নির্ধারণ করছে? এছাড়াও, আমার এ সম্পর্কে আমার জ্ঞানটি কিছুকাল আগে থেকে এসেছে তাই এটি হতে পারে যে জিনিসগুলি সম্প্রতি সামান্য পরিবর্তিত হয়েছে, যদিও এটি এমন একটি অঞ্চল নয় যা আমি আশা করি নতুন পরীক্ষামূলক শেল বাদে প্রচুর গতিবিধি দেখার আশা করি।
ডেভিড স্পিললেট

আমি একই ফলাফল পেতে ksh, zsh, dash, fishএবং ব্যাশ 3 হিসাবে আমি ব্যাশ 4. করেছিল ত্রুটি বার্তা থেকে fishতথ্যপূর্ণ হতে পারে: "মাছ: যুক্তি ও পরিবেশ তালিকার মোট আকার (130kB) 2.0MB এর অপারেটিং সিস্টেম সীমা ছাড়িয়ে গেছে । " তবে, set | wc -c306317 এবং env | wc -c2507 যা পার্থক্যের জন্য অ্যাকাউন্ট করে না। আমি জানি না আর কী গণনা করা হচ্ছে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

11

এআরজি_এমএক্স প্রকৃতপক্ষে কমান্ড লাইন এবং পরিবেশের মোট আকারকে সীমাবদ্ধ করে, তবে আপনি একটি অতিরিক্ত সীমাবদ্ধতার মুখোমুখি হন: একটি যুক্তি অবশ্যই MAX_ARG_STRLEN এর চেয়ে বেশি হওয়া উচিত নয় (যা দুর্ভাগ্যক্রমে 131072 হ'ল হার্ড-কোডেড)।

Https://unix.stackexchange.com/questions/120642/ what- defines- the- maximum- size- for- a- command- single- argument দেখুন


1

আপনি দীর্ঘতম পরিবর্তনশীল দৈর্ঘ্য কি বোঝাতে চান? খুব দীর্ঘ ভেরিয়েবলের নামটি তৈরি করতে আপনি পার্লের "এক্স" ব্যবহার করতে পারেন:

 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

2
আসলে যে একটি খুব দীর্ঘ পরিবর্তনশীল এর মান
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

3
এছাড়াও, আপনাকে ব্যবহার করতে হবে না 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(), ইত্যাদি)।
ভিসেন্টে ওলিভার্ট রিরা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.