मैं इस धारणा के अधीन था कि किसी एकल तर्क की अधिकतम लंबाई यहाँ समस्या नहीं थी, क्योंकि कुल तर्क सरणी का कुल आकार और पर्यावरण का आकार, जो कि सीमित है ARG_MAX
। इस प्रकार मैंने सोचा कि निम्नलिखित की तरह कुछ सफल होगा:
env_size=$(cat /proc/$$/environ | wc -c)
(( arg_size = $(getconf ARG_MAX) - $env_size - 100 ))
/bin/echo $(tr -dc [:alnum:] </dev/urandom | head -c $arg_size) >/dev/null
- 100
खोल और echo
प्रक्रिया में पर्यावरण के आकार के बीच अंतर के लिए पर्याप्त से अधिक होने के साथ । इसके बजाय मुझे त्रुटि मिली:
bash: /bin/echo: Argument list too long
थोड़ी देर तक खेलने के बाद, मैंने पाया कि अधिकतम छोटे आकार का एक पूर्ण हेक्स क्रम था:
/bin/echo \
$(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \
>/dev/null
जब माइनस एक हटा दिया जाता है, तो त्रुटि वापस आ जाती है। एक तर्क के लिए अधिकतम अधिकतम वास्तव में है ARG_MAX/16
और -1
तर्क सरणी में स्ट्रिंग के अंत में रखी गई अशक्त बाइट के लिए खाते हैं।
एक और मुद्दा यह है कि जब तर्क दोहराया जाता है, तो तर्क सरणी का कुल आकार करीब हो सकता है ARG_MAX
, लेकिन अभी भी काफी नहीं है:
args=( $(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) )
for x in {1..14}; do
args+=( ${args[0]} )
done
/bin/echo "${args[@]}" "${args[0]:6534}" >/dev/null
"${args[0]:6533}"
यहाँ का उपयोग अंतिम तर्क 1 बाइट को लंबा बनाता है और Argument list too long
त्रुटि देता है । यह अंतर दिए गए पर्यावरण के आकार के हिसाब से होने की संभावना नहीं है:
$ cat /proc/$$/environ | wc -c
1045
प्रशन:
- क्या यह सही व्यवहार है, या कहीं एक बग है?
- यदि नहीं, तो क्या यह व्यवहार कहीं प्रलेखित है? क्या एक और पैरामीटर है जो एक एकल तर्क के लिए अधिकतम परिभाषित करता है?
- क्या यह व्यवहार लिनक्स (या ऐसे विशेष संस्करण) तक सीमित है?
- तर्क सरणी के वास्तविक अधिकतम आकार और पर्यावरण के अनुमानित आकार के बीच अतिरिक्त ~ 5KB विसंगति के लिए क्या खाते हैं और
ARG_MAX
?
अतिरिक्त जानकारी:
uname -a
Linux graeme-rock 3.13-1-amd64 #1 SMP Debian 3.13.5-1 (2014-03-04) x86_64 GNU/Linux
getconf ARG_MAX
पर, वर्तमान पर निर्भर करता है ulimit -s
। इसे असीमित पर सेट करें, और ARG_MAX के लिए एक अद्भुत 4611686018427387903 प्राप्त करें।