मैंने पाया कि यह "तर्क बहुत लंबा" त्रुटि को बढ़ाएगा:
ls *.*
और यह इसे नहीं बढ़ाएगा:
for file in *.*
do
echo $file
done
क्यों?
मैंने पाया कि यह "तर्क बहुत लंबा" त्रुटि को बढ़ाएगा:
ls *.*
और यह इसे नहीं बढ़ाएगा:
for file in *.*
do
echo $file
done
क्यों?
जवाबों:
"तर्क बहुत लंबा" त्रुटि है E2BIG, execveसिस्टम कॉल द्वारा उठाया जाता है यदि तर्कों का कुल आकार (प्लस सिस्टम पर पर्यावरण,) बहुत बड़ा है। execveकॉल एक है कि बाहरी प्रक्रियाओं शुरू होता है, विशेष रूप से एक अलग निष्पादन योग्य फ़ाइल लोड हो रहा है (वहाँ एक अलग कॉल है, fork, एक अलग प्रक्रिया है जिसका कोड एक ही निष्पादन योग्य फ़ाइल से अब भी है चलाने के लिए)। forतो यह बुला शामिल नहीं करता है पाश, एक आंतरिक खोल निर्माण है execve। ls *.*जब गोला का विस्तार होता है, लेकिन जब lsकॉल किया जाता है , तो कमांड एरर उठाती है।
execveत्रुटि के साथ विफल रहता है E2BIGजब कमांड का कुल आकार ARG_MAX सीमा से बड़ा होता है । आप अपने सिस्टम पर कमांड के साथ इस सीमा का मूल्य देख सकते हैं getconf ARG_MAX। (यह संभव है कि आप इस सीमा पर जा सकते हैं यदि आपके पास पर्याप्त मेमोरी है, तो ARG_MAXगारंटी के तहत रखना execveजब तक कोई असंबंधित काम नहीं करेगा।)
execveकर्नेल द्वारा सीमा को लागू किया जाता है, यह सीमाएं डालता है क्योंकि तर्क को एक बिंदु पर कर्नेल मेमोरी के माध्यम से कॉपी करने की आवश्यकता होती है और उपयोगकर्ता प्रक्रियाओं को शेल मेमोरी की एक मनमानी राशि का अनुरोध करने की अनुमति नहीं दी जा सकती है। शेल के अंदर, कोई सीमा नहीं है, वर्चुअल मेमोरी में फिट होने वाली कोई भी चीज ठीक नहीं है।
मुझे लगता है कि पहले उदाहरण lsमें / जोड़ी सिस्टम कॉल के bashमाध्यम से निष्पादित किया जाता है , दूसरे में, सभी कामकाज आंतरिक हैं ।forkexecbash
execकॉल सीमा नहीं होती, के आंतरिक कार्य bash(बेहतर या, अलग सीमा के साथ कुछ नहीं करना है कि बजाय नहीं है exec, शायद उपलब्ध स्मृति की मात्रा)।
execमें /usr/include/linux/limits.hआम तौर पर, के रूप में परिभाषित ARG_MAX।
क्योंकि इसके मामले में lsएक तर्क है, और तर्कों की संख्या सीमित है।
forचक्र के मामले में , यह केवल वस्तुओं की एक सूची है। उसके लिए कोई सीमा नहीं है (जहाँ तक मैं जानता हूँ)।
for i in {00000001..20000000} ;do ((10#$i==1)) && break; done
/bin/bashबनाम/bin/sh(जो कि शायद डैश का लिंक है)?