लिनक्स कमांड लाइन वर्ण सीमा


27

मैं कमांड लाइन पर एक स्क्रिप्ट के लिए एक चर पारित कर रहा हूँ। एक कमांड की वर्ण सीमा क्या है? उदाहरण के लिए:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

धन्यवाद।


1
मुझे सवाल समझ में नहीं आया। क्या आप पात्रों की सीमा में रुचि रखते हैं?
क्रिस्सी

आपको अपने प्रश्न को अधिक स्पष्ट रूप से बताने की आवश्यकता है, अन्यथा इसके बस बंद होने जा रहे हैं।
ThatGraemeGuy

जवाबों:


27

शेल / ओएस लगाई गई सीमा आम तौर पर बहुत लंबी होती है - आमतौर पर एक या दो सौ हजार अक्षर।

getconf ARG_MAXआपको एक कमांड के लिए अधिकतम इनपुट सीमा देगा। डेबियन सिस्टम पर वर्तमान में इस रिटर्न 131072 पर एक टर्मिनल खुला है जो 128 * 1024 है। यह सीमा आपके पर्यावरण चर से कम हो जाती है जैसे कि मेरी स्मृति मुझे सही ढंग से कार्य करती है ये शेल द्वारा उसी संरचना में पारित किए जाते हैं, हालांकि यह ज्यादातर मामलों में कुछ सौ वर्णों को ही हटा देगा। इस मूल्य रन के एक अनुमान को खोजने के लिए env | wc -c- यह इस मशीन पर इस लॉगिन पर वर्तमान समय में 325 वर्णों का सुझाव देता है।

लिपियों को इस पूरी लंबाई की अनुमति देने की संभावना है, लेकिन यह संभावना नहीं है कि अन्य उपयोगिताओं जानबूझकर या डिजाइन मुद्दों के साथ अपनी सीमाएं लगाएंगे। कृत्रिम सीमाएं भी हो सकती हैं कि एक लंबी कमांड लाइन पर किसी व्यक्ति का तर्क कितना लंबा हो सकता है और / या किसी फाइल का रास्ता कितना लंबा हो सकता है।


2
मेरे सिस्टम पर, getconf ARG_MAX2097152 देता है, लेकिन जो अधिकतम arg लंबाई मैं पास कर सकता हूं वह अभी भी 131071 है (और मुझे पर्यावरण के आकार में कटौती नहीं करनी है)।
अगली सूचना तक रोक दिया गया।

1
यह भी याद रखें कि विशाल तर्क सूचियों से निपटने के दौरान xargsभी और यहां तक कि find -execआपके मित्र भी ।
coredump

@ डेनिस: getconfमेरे द्वारा दिया गया मान कर्नेल स्तर है। शायद बैश अपने डिजाइन / विन्यास द्वारा एक निचली सीमा तय कर रहा है? इसके अलावा, मेरा ज्ञान कुछ समय पहले से आता है, इसलिए यह हो सकता है कि चीजें हाल ही में बदल गई हैं, हालांकि यह एक ऐसा क्षेत्र नहीं है जिसे मैं नए प्रयोगात्मक गोले को छोड़कर बहुत सारे आंदोलन देखने की उम्मीद करूंगा।
डेविड स्पिल्ट

मैं में एक ही परिणाम प्राप्त ksh, zsh, dash, fishऔर बैश 3 के रूप में मैं बैश 4. में किया था त्रुटि संदेश से fishजानकारीपूर्ण हो सकता है: "मछली: तर्क और पर्यावरण सूचियों का कुल आकार (130kb) 2.0 MB के ऑपरेटिंग सिस्टम सीमा से अधिक है । " हालाँकि, set | wc -c306317 है और env | wc -c2507 है जो अंतर के लिए जिम्मेदार नहीं है। मुझे नहीं पता कि और क्या गिना जा रहा है।
अगली सूचना तक रोक दिया गया।

11

ARG_MAX वास्तव में कमांड लाइन और पर्यावरण के कुल आकार को सीमित करता है, लेकिन आप एक अतिरिक्त सीमा का सामना कर रहे हैं: एक तर्क MAX_ARG_STRLEN से अधिक लंबा नहीं होना चाहिए (जो दुर्भाग्य से हार्ड-कोड 131072 है)।

Https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument देखें


1

क्या आपका मतलब है सबसे लंबी परिवर्तनशील लंबाई? यह पता लगाने के लिए कि आप बहुत लंबे चर नाम बनाने के लिए पर्ल के "x" का उपयोग कर सकते हैं:

 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(), आदि)।
विसेंट ओलिवर रिवेरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.