मैं कमांड लाइन पर एक स्क्रिप्ट के लिए एक चर पारित कर रहा हूँ। एक कमांड की वर्ण सीमा क्या है? उदाहरण के लिए:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
धन्यवाद।
मैं कमांड लाइन पर एक स्क्रिप्ट के लिए एक चर पारित कर रहा हूँ। एक कमांड की वर्ण सीमा क्या है? उदाहरण के लिए:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
धन्यवाद।
जवाबों:
शेल / ओएस लगाई गई सीमा आम तौर पर बहुत लंबी होती है - आमतौर पर एक या दो सौ हजार अक्षर।
getconf ARG_MAXआपको एक कमांड के लिए अधिकतम इनपुट सीमा देगा। डेबियन सिस्टम पर वर्तमान में इस रिटर्न 131072 पर एक टर्मिनल खुला है जो 128 * 1024 है। यह सीमा आपके पर्यावरण चर से कम हो जाती है जैसे कि मेरी स्मृति मुझे सही ढंग से कार्य करती है ये शेल द्वारा उसी संरचना में पारित किए जाते हैं, हालांकि यह ज्यादातर मामलों में कुछ सौ वर्णों को ही हटा देगा। इस मूल्य रन के एक अनुमान को खोजने के लिए env | wc -c- यह इस मशीन पर इस लॉगिन पर वर्तमान समय में 325 वर्णों का सुझाव देता है।
लिपियों को इस पूरी लंबाई की अनुमति देने की संभावना है, लेकिन यह संभावना नहीं है कि अन्य उपयोगिताओं जानबूझकर या डिजाइन मुद्दों के साथ अपनी सीमाएं लगाएंगे। कृत्रिम सीमाएं भी हो सकती हैं कि एक लंबी कमांड लाइन पर किसी व्यक्ति का तर्क कितना लंबा हो सकता है और / या किसी फाइल का रास्ता कितना लंबा हो सकता है।
getconf ARG_MAX2097152 देता है, लेकिन जो अधिकतम arg लंबाई मैं पास कर सकता हूं वह अभी भी 131071 है (और मुझे पर्यावरण के आकार में कटौती नहीं करनी है)।
xargsभी और यहां तक कि find -execआपके मित्र भी ।
getconfमेरे द्वारा दिया गया मान कर्नेल स्तर है। शायद बैश अपने डिजाइन / विन्यास द्वारा एक निचली सीमा तय कर रहा है? इसके अलावा, मेरा ज्ञान कुछ समय पहले से आता है, इसलिए यह हो सकता है कि चीजें हाल ही में बदल गई हैं, हालांकि यह एक ऐसा क्षेत्र नहीं है जिसे मैं नए प्रयोगात्मक गोले को छोड़कर बहुत सारे आंदोलन देखने की उम्मीद करूंगा।
ksh, zsh, dash, fishऔर बैश 3 के रूप में मैं बैश 4. में किया था त्रुटि संदेश से fishजानकारीपूर्ण हो सकता है: "मछली: तर्क और पर्यावरण सूचियों का कुल आकार (130kb) 2.0 MB के ऑपरेटिंग सिस्टम सीमा से अधिक है । " हालाँकि, set | wc -c306317 है और env | wc -c2507 है जो अंतर के लिए जिम्मेदार नहीं है। मुझे नहीं पता कि और क्या गिना जा रहा है।
ARG_MAX वास्तव में कमांड लाइन और पर्यावरण के कुल आकार को सीमित करता है, लेकिन आप एक अतिरिक्त सीमा का सामना कर रहे हैं: एक तर्क MAX_ARG_STRLEN से अधिक लंबा नहीं होना चाहिए (जो दुर्भाग्य से हार्ड-कोड 131072 है)।
Https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument देखें
क्या आपका मतलब है सबसे लंबी परिवर्तनशील लंबाई? यह पता लगाने के लिए कि आप बहुत लंबे चर नाम बनाने के लिए पर्ल के "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
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(), आदि)।