বাশ কমান্ড লাইন এবং ইনপুট সীমা


90

কোনও ইনপুট কতক্ষণ দীর্ঘ হতে পারে তার জন্য বাশে (বা অন্যান্য শেলস) কিছু চরিত্রের সীমা আরোপিত আছে? যদি তা হয় তবে সেই চরিত্রের সীমা কী?

অর্থাত্ কমান্ড লাইনটি কার্যকর করার জন্য খুব দীর্ঘ বাশিতে কোনও কমান্ড লেখা সম্ভব? প্রয়োজনীয় সীমা না থাকলে কোনও প্রস্তাবিত সীমা আছে কি?


4
ইনপুট সীমা থেকে ভিন্ন অপারেটিং সিস্টেম-স্তরীয় যুক্তি সীমা (নোট যে কিছু যেমন বিভিন্ন পরিবেশের যেমন যুক্তি ছাড়া অন্য কিছু, এছাড়াও যে এক দিকে প্রযোজ্য)। অপারেটিং সিস্টেমে উত্পন্ন কমান্ডের শেল কমান্ডের তুলনায় কম বা বেশি অক্ষর থাকতে পারে।
চার্লস ডাফি

উত্তর:


126

কমান্ড লাইনের দৈর্ঘ্যের সীমা শেল দ্বারা চাপানো হয়নি, তবে অপারেটিং সিস্টেম দ্বারা। এই সীমাটি সাধারণত শত কিলোবাইটের মধ্যে থাকে। পসিক্স এই সীমাটিকে বোঝায় ARG_MAXএবং পসিক্স কনফরম্যান্ট সিস্টেমগুলিতে আপনি এটিকে জিজ্ঞাসা করতে পারেন

$ getconf ARG_MAX    # Get argument limit in bytes

সাইগউইনে যেমন এটি 32000, এবং আমি বিভিন্ন বিএসডি এবং লিনাক্স সিস্টেমে এটি ব্যবহার করি এটি 131072 থেকে 2621440 পর্যন্ত যে কোনও জায়গায়।

আপনি এই সীমা মাত্রাধিক ফাইলগুলির একটি তালিকা প্রক্রিয়া করার প্রয়োজন হলে, আপনি তাকান করতে চাইবেন xargsইউটিলিটি, যা আর্গুমেন্ট একটি উপসেট অনধিক সঙ্গে বারবার একটি প্রোগ্রাম কল ARG_MAX

আপনার নির্দিষ্ট প্রশ্নের উত্তর দিতে, হ্যাঁ, খুব দীর্ঘ আর্গুমেন্টের তালিকা দিয়ে কোনও কমান্ড চালানোর চেষ্টা করা সম্ভব। শেলটি "আর্গুমেন্টের তালিকা খুব দীর্ঘ" বরাবর একটি বার্তার সাথে ত্রুটি করবে।

নোট করুন যে কোনও প্রোগ্রামের ইনপুট (যেমন স্টিডিন বা অন্য কোনও ফাইল বর্ণনাকারীর উপর পড়ে) সীমাবদ্ধ নয় (কেবলমাত্র উপলব্ধ প্রোগ্রামের সংস্থান দ্বারা)। সুতরাং আপনার শেল স্ক্রিপ্ট যদি কোনও ভেরিয়েবলের মধ্যে স্ট্রিং পড়ে, আপনি দ্বারা সীমাবদ্ধ নেই ARG_MAX। বিধিনিষেধটি শেল-বিল্টিনগুলিতেও প্রযোজ্য নয়।


উত্তম উত্তর, তবুও আমি একটি ব্যাখ্যা চাই। যদি আমি কোনও কনস্ট্রাক্ট cmd <<< "$LONG_VAR"পাই এবং লং_ভিআর মান সীমা ছাড়িয়ে যায় তবে এটি কি আমার আদেশটি ফুটিয়ে তুলবে?
ক্রিজিসটফ জাবোসস্কি

4
@ ক্রিজিসটফজাবোওস্কি বিপরীতভাবে, কারণ বিষয়বস্তু LONG_VARস্টিডিনে পাস হয়েছে - এবং এটি পুরোপুরি শেলের মধ্যে সম্পন্ন হয়; এটি আর্গুমেন্ট হিসাবে প্রসারিত হয় না cmd, তাই কাঁটাচামচ () / এক্সিকিউটিভ () এর জন্য ARG_MAX সীমা কার্যকর হয় না। নিজেকে চেষ্টা করা সহজ: এআরজি_এমএক্স ছাড়িয়ে থাকা সামগ্রী সহ একটি ভেরিয়েবল তৈরি করুন এবং আপনার আদেশটি চালান run
জেনস

4
এখানে শোধন, রেকর্ডের জন্য দেওয়া হল: একটি 8 মেগাবাইট m4a ফাইলের জন্য, আমি যা করেছে: blah="$(cat /home/schwager/Music/Recordings/20090420\ 131623.m4a)"; cat <<< $blah >/dev/null। কোনও ত্রুটি নোট করুন।
মাইক এস

4
ছোট্ট ক্যাভ্যাট পরিবেশের পরিবর্তনগুলিও গণনা করে। sysconf manpage > এটি ARG_MAX ব্যবহার করা কঠিন কারণ এটি নির্ধারণ করা হয়নি যে নির্বাহী (3) এর জন্য আর্গুমেন্ট স্পেসের কত> ব্যবহারকারীর> পরিবেশের ভেরিয়েবল ব্যবহার করে।
জেরিট

4
@ user188737 আমি এমন অনুভব একটি চমত্কার বড় সতর্কীকরণ হয় বাগ । উদাহরণস্বরূপ xargsম্যাকোস 10.12.6 এ এটি কতটা করার চেষ্টা করে তা সীমাবদ্ধ exec()করে ARG_MAX - 4096। সুতরাং স্ক্রিপ্টগুলি ব্যবহার xargsকরতে পারে যখন একদিন কেউ পরিবেশে খুব বেশি জিনিস রাখে। এটি এখন চলছে (এটির সাথে এটির সাথে কাজ করুন xargs -s ???:)।
নিউরালমার

44

ঠিক আছে, ডেনিজেনস তাই আমি বেশ কিছু সময়ের জন্য কমান্ড লাইনের দৈর্ঘ্যের সীমাটিকে সুসমাচার হিসাবে গ্রহণ করেছি। তাহলে, কারও অনুমান নিয়ে কী করব? স্বাভাবিকভাবেই- এগুলি পরীক্ষা করে দেখুন।

আমার কাছে আমার ফেডোরা 22 মেশিন রয়েছে (অর্থাত: ব্যাশ 4 সহ লিনাক্স)। আমি এটির মধ্যে 18 টি অক্ষরের দীর্ঘ প্রতিটি 500,000 ইনোড (ফাইল) দিয়ে একটি ডিরেক্টরি তৈরি করেছি। কমান্ড লাইনের দৈর্ঘ্য 9,500,000 টি অক্ষর। এইভাবে তৈরি:

seq 1 500000 | while read digit; do
    touch $(printf "abigfilename%06d\n" $digit);
done

এবং আমরা দ্রষ্টব্য:

$ getconf ARG_MAX
2097152

নোট তবে আমি এটি করতে পারেন:

$ echo * > /dev/null

তবে এটি ব্যর্থ:

$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long

আমি লুপের জন্য চালাতে পারি:

$ for f in *; do :; done

এটি অন্য শেল অন্তর্নির্মিত।

রাজ্যগুলির জন্য ডকুমেন্টেশনেরARG_MAX যত্ন সহকারে পড়া, নির্বাহী কার্যগুলির পক্ষে যুক্তির সর্বাধিক দৈর্ঘ্য । এর অর্থ: কল না করে execকোনও ARG_MAXসীমাবদ্ধতা নেই। সুতরাং এটি শেল বিল্টিনগুলি কেন সীমাবদ্ধ নয় তা ব্যাখ্যা করবে ARG_MAX

এবং প্রকৃতপক্ষে, আমি lsযদি আমার যুক্তি তালিকার 109948 ফাইল দীর্ঘ বা প্রায় 2,089,000 অক্ষর (দিতে বা নিতে পারি) তবে আমি আমার ডিরেক্টরিটি করতে পারি। একবার আমি আরও একটি 18-চরিত্রের ফাইলের নাম ফাইল যুক্ত করি, তবুও আমি একটি দীর্ঘ ত্রুটি পেয়েছি । তাই ARG_MAXবিজ্ঞাপনে হিসেবে কাজ হয়: Exec বেশি ব্যর্থ হচ্ছে ARG_MAXসহ তালিকা- যুক্তি উপর অক্ষর, এটা উল্লেখ করা উচিত, পরিবেশ ডেটা।


হুঁ। আমি বিল্টিনগুলি প্রশ্নের মধ্যে সীমাবদ্ধতার বিষয়বস্তু ছিল তা বোঝাতে বিদ্যমান উত্তরটি পড়িনি, তবে কেউ কীভাবে পারে তা অবশ্যই দেখতে পাচ্ছি।
চার্লস ডাফি

6
হ্যাঁ, আমি মনে করি এটি মনে রাখা শক্ত especially বিশেষত নতুন কমান্ড-লাইন অ্যাফিশিয়ানাডো -দের জন্য যে ব্যাশ বিল্টিন বনাম কাঁটাচামচ / আদেশ প্রয়োগের ডাক দেওয়ার পরিস্থিতি অ-স্পষ্ট উপায়ে আলাদা। আমি এটা পরিষ্কার করতে চেয়েছিলাম। একটি প্রশ্ন যা আমি প্রায়শই একটি কাজের সাক্ষাত্কারে পেতে পারি (লিনাক্স স্যাসাডমিন হিসাবে), "সুতরাং আমি একটি ডিরেক্টরিতে অনেকগুলি ফাইল পেয়েছি them আমি কীভাবে এগুলির সবগুলি লুপ করব ..." প্রশ্নকর্তা অবিচ্ছিন্নভাবে লাইনের দিকে এগিয়ে চলেছে দৈর্ঘ্য সীমা এবং একটি সন্ধান করতে / যখন বা xargs সমাধান চায়। ভবিষ্যতে আমি বলব, "আহ হেল - লুপের জন্য কেবল একটি ব্যবহার করুন। এটি এটি পরিচালনা করতে পারে!" :-)
মাইক এস

@ মাইকস যখন আপনি লুপের জন্য কিছু করতে পারছেন, আপনি যদি ফাইন্ড-জার্সস কম্বো ব্যবহার করতে পারেন তবে আপনি অনেক কম কাঁটাচামচ করবেন এবং দ্রুত হবে be ;-)
লেস্টার চেউং

4
@ লেস্টারচেউং for f in *; do echo $f; doneমোটেও কাঁটাচামচ করবেন না (সমস্ত বিল্টইনস)। সুতরাং আমি জানি না যে একটি ফাইন্ড-জার্গস কম্বো দ্রুততর হবে; এটি পরীক্ষা করা হয়নি। আসলে, আমি জানি না যে ওপির সমস্যা সেটটি কী। সম্ভবত এটি find /path/to/directoryতার পক্ষে কার্যকর হবে না কারণ এটি ফাইলের পথের নামটি ফিরিয়ে দেবে। সম্ভবত তিনি একটি for f in *লুপের সরলতা পছন্দ করেন । নির্বিশেষে, কথোপকথনটি লাইন ইনপুট সীমা সম্পর্কে - দক্ষতা নয়। সুতরাং আসুন বিষয়টিতে থাকুন, যা লাইন দৈর্ঘ্যের কমান্ডের সাথে সম্পর্কিত।
মাইক এস

এফডব্লিউআইডাব্লু, সমস্যাটি, যেমনটি আমি স্মরণ করি, কেবল সি তে একটি শেল লেখার চেষ্টা করছিল এবং নির্ধারণ করছিলাম যে আমার কতক্ষণ ইনপুট থাকতে দেওয়া উচিত।
ডেরেক হালডেন

-3

1024 এর মতো কোনও কিছুর একটি বাফার সীমা রয়েছে। পঠনটি কেবল মিড পেষ্ট বা ইনপুট আটকে দেবে। এটি সমাধান করতে -e বিকল্পটি ব্যবহার করুন।

http://linuxcommand.org/lc3_man_pages/readh.html

একটি ইন্টারেক্টিভ শেলের লাইন পেতে রিডলাইন ব্যবহার করুন

আপনার পড়তে পড়তে পরিবর্তন করুন এবং বিরক্তিকর লাইন ইনপুট হ্যাং চলে যায়।


4
এটি সম্পর্কে নয় read: "অর্থাত্ কমান্ড লাইনটি কার্যকর করার জন্য বাশ-এ কোনও কমান্ড লেখা সম্ভব?"
চই টি। রেক্স

@ চ্যাটি.আরেক্স আপনি এক প্রকারের সঠিক, তবে এখানে জিনিসটি রয়েছে: রিডলাইন ছাড়াই আন্তঃসংযোগমূলকভাবে বাশ চালানোর চেষ্টা করুন, অর্থাত্ bash --noeditingনতুন প্রম্পটে কমান্ডটি চালানোর চেষ্টা করুন echo somereallylongword, যেখানে কিছুটা দীর্ঘমেয়াদী শব্দটি 4090 অক্ষরের চেয়ে দীর্ঘ। উবুন্টু 18.04-এ চেষ্টা করা হয়েছে, শব্দটি কেটে গেছে, সুতরাং স্পষ্টতই এটির সাথে পাঠ্যলাইন সক্ষম না হওয়ার কিছু আছে।
আমির

@ আমির আকর্ষণীয়! আপনি সঠিক! আমি উত্তরটি সম্পাদনা করার চেষ্টা করেছি, কিন্তু তখন আমি বুঝতে পেরেছি যে -e বিকল্পটি এই প্রসঙ্গে ব্যাশের ক্ষেত্রে প্রযোজ্য নয় (ব্যাশে, এটি ত্রুটির সাথে সাথেই শেলটি প্রস্থান করে) its এবং আমি নিশ্চিত নই যে পল কেন পড়তে আগ্রহী। যাইহোক, ব্যাশ --Noreadline দিয়ে শুরু করা হলে 4-5000 টির মধ্যে বাফারের সীমা থাকে। এটি এমন একটি পার্শ্ব প্রতিক্রিয়া যা আমি জানতাম না বা আশাও করি না।
মাইক এস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.