आपको उबास द्वारा उपयोग की जाने वाली बैश कम्प्लीशन लाइब्रेरी में एक बग मिला ।
इसका क्या मतलब है?
उबंटू बश पूरा होने वाले पुस्तकालय को स्मार्ट बनाने के लिए उपयोग करता है। यह लाइब्रेरी में रहता है /usr/share/bash-completion/bash_completion
।
अनिवार्य रूप से, यह पुस्तकालय कुछ चतुर कार्यों की घोषणा करता है जो विशिष्ट आदेशों के बारे में जानते हैं और उन्हें कैसे पूरा करें। जब भी आप दबाते हैं Tab, तो इस लाइब्रेरी के भीतर फंक्शंस मिलते हैं और आपकी वर्तमान कमांड लाइन को पूरा करने का प्रयास किया जाता है। उदाहरण के लिए यदि आप टाइप apt-get i
Tabकरते हैं तो यह पूरा हो जाएगा apt-get install
। यदि आप उस लाइब्रेरी को स्रोत नहीं करते हैं, तो आपके पास केवल मानक, आदिम बैश पूर्णता है - इसलिए उदाहरण के लिए यदि आप apt-get i
Tabइसे बिना सॉर्ट किए टाइप करते हैं, तो बैश बस वर्तमान डायरेक्टरी में फाइलों की तलाश करेगा जिसके साथ शुरू होता है i
और आपके आदेश के अनुसार पूरा करने का प्रयास करता है। ये फ़ाइल नाम।
यह जड़ के रूप में क्यों नहीं हो रहा है?
क्योंकि जब आप sudo su
अपने आप को बनाने के लिए उपयोग करते हैं root
, तो बैश पूरा होने वाला पुस्तकालय खट्टा नहीं होता है। यह अलग होता अगर आप sudo -i
खुद बनाते थे root
। मुझे यकीन है कि आप बग देखते हैं, तो नहीं? उदाहरण के लिए देखें 'sudo su -' बनाम 'sudo -i' बनाम 'sudo / bin / bash' - यह कब उपयोग किया जाता है, या यह बिल्कुल मायने रखता है? यदि आप मतभेदों से परिचित नहीं हैं।
मेरे मामले में, एक सामान्य उपयोगकर्ता के रूप, पुस्तकालय sourced हो जाता है जब मैं एक बैश खोल शुरू क्योंकि ~/.bashrc
सूत्रों /etc/bash_completion
जो स्रोतों /usr/share/bash-completion/bash_completion
।
यदि मैं sudo -i
लॉगिन करने के लिए उपयोग करता हूं root
, तो लाइब्रेरी स्रोत के रूप में /etc/profile
स्रोत के रूप में स्रोत से अलग हो /etc/profile.d/bash_completion.sh
जाती है /usr/share/bash-completion/bash_completion
।
वह बग क्यों हो रहा है?
इस कमांड को निष्पादित करने का प्रयास करें:
$ eval 'quoted=$(cat' env.
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
जाना पहचाना? ;-) वास्तव में, यह वही है जो पर्दे के पीछे हुआ जब Tabआप वर्णित संदर्भ में हिट करते हैं । अधिक सटीक रूप से, बग _quote_readline_by_ref
द्वारा घोषित फ़ंक्शन में है /usr/share/bash-completion/bash_completion
। यदि आपको वह फ़ाइल खट्टी है, तो आपके पास वह फ़ंक्शन उपलब्ध होना चाहिए। तो अगला प्रयास करें:
$ _quote_readline_by_ref '$(cat env.' quoted
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
इन तर्कों को देखते हुए, फ़ंक्शन _quote_readline_by_ref
, अन्य बातों के अलावा, जो eval
ऊपर उल्लेखित है। आप चाहें तो एक नज़र रख सकते हैं। और जब आप टाइप करते हैं env $(cat env.
Tab, तो उस फंक्शन के पीछे जो दृश्य मिलते हैं, वे बिल्कुल उन तर्कों के साथ कहे जाते हैं। तो वही हुआ।
यह eval
हैक एक अन्य समस्या को ठीक करने वाला था , लेकिन मुझे लगता है कि इसने इस प्रक्रिया में अन्य बग को पेश किया।
मैं इसे कैसे ठीक करूं?
यह पता चला है कि यह बग पहले ही सूचित किया जा चुका है । उस बग रिपोर्ट को पढ़ने के बाद, मुझे इसे ठीक करने के तीन तरीके दिखाई देते हैं:
इसे पैच करें: उस बग रिपोर्ट की टिप्पणियों में, कोई व्यक्ति लाइन को बदलने का सुझाव देता है
[[ ${!2} == \$* ]] && eval $2=${!2}
_quote_readline_by_ref
फ़ाइल /usr/share/bash-completion/bash_completion
में लाइन द्वारा फ़ंक्शन
[[ ${!2} == \$\'* ]] && eval $2=${!2}
मैं ऐसा करने के खिलाफ सलाह देता हूं। जिस व्यक्ति ने वह टिप्पणी लिखी है, वह बैश-समापन का डेवलपर नहीं प्रतीत होता है । यह हॉटफ़िक्स केवल कथन के बाएँ ऑपरेंड को गलत का मूल्यांकन करने का कारण बनेगा और इस प्रकार ऐसा होने eval
से रोकेगा । हालाँकि उस कार्य को क्या करना चाहिए और इसे किस संदर्भ में कहा जाता है, इस बारे में अच्छी जानकारी के बिना, यह स्पष्ट नहीं है कि क्या यह संभावित रूप से कुछ अन्य अपेक्षित कार्यक्षमता को नहीं तोड़ेगा।
नवीनतम संस्करण प्राप्त करें: जैसा कि उस बग रिपोर्ट में भी उल्लेख किया गया है, यह बग गिट हेड (जिसमें अन्य परिवर्तनों के बीच फ़ंक्शन _quote_readline_by_ref
को सरल बनाया गया है) में मौजूद नहीं है। आप बस Git से वर्तमान संशोधन को क्लोन कर सकते हैं:
git clone https://salsa.debian.org/debian/bash-completion.git
... और फिर bash_completion
स्क्रिप्ट के नवीनतम संस्करण को कॉपी करें /usr/share/bash-completion
(पुराने संस्करण का बैकअप लेने की कोई तत्काल आवश्यकता नहीं है, जब तक कि यह आपको सुरक्षित महसूस नहीं करता है - यदि आप कुछ समस्याओं का अनुभव करते हैं, sudo apt-get install --reinstall bash-completion
तो आपके द्वारा ठीक किए गए किसी भी परिवर्तन को वापस लेना चाहिए।) यही तरीका है I अगर आप इसे ठीक करवाने की जल्दबाजी में हैं तो सलाह दें। :-)
ध्यान दें कि उन समाधानों में से कोई भी कमांड प्रतिस्थापन कार्य के अंदर बैश पूरा नहीं करेगा: जैसा कि उसी बग रिपोर्ट में उल्लेख किया गया है, यह बैश 4.3 में टूट गया है।
- वापस बैठो और रुको: जल्द ही या बाद में एक नया संस्करण जारी किया जाएगा (जो कमांड प्रतिस्थापन के अंदर बैश पूरा करने को भी ठीक कर सकता है) और आपको इसे भविष्य के कुछ उबंटू संस्करण के साथ मिलेगा। यही कारण है कि मैं ;-) के लिए जा रहा हूं