आपको उबास द्वारा उपयोग की जाने वाली बैश कम्प्लीशन लाइब्रेरी में एक बग मिला ।
इसका क्या मतलब है?
उबंटू बश पूरा होने वाले पुस्तकालय को स्मार्ट बनाने के लिए उपयोग करता है। यह लाइब्रेरी में रहता है /usr/share/bash-completion/bash_completion।
अनिवार्य रूप से, यह पुस्तकालय कुछ चतुर कार्यों की घोषणा करता है जो विशिष्ट आदेशों के बारे में जानते हैं और उन्हें कैसे पूरा करें। जब भी आप दबाते हैं Tab, तो इस लाइब्रेरी के भीतर फंक्शंस मिलते हैं और आपकी वर्तमान कमांड लाइन को पूरा करने का प्रयास किया जाता है। उदाहरण के लिए यदि आप टाइप apt-get iTabकरते हैं तो यह पूरा हो जाएगा apt-get install। यदि आप उस लाइब्रेरी को स्रोत नहीं करते हैं, तो आपके पास केवल मानक, आदिम बैश पूर्णता है - इसलिए उदाहरण के लिए यदि आप apt-get iTabइसे बिना सॉर्ट किए टाइप करते हैं, तो बैश बस वर्तमान डायरेक्टरी में फाइलों की तलाश करेगा जिसके साथ शुरू होता है 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 में टूट गया है।
- वापस बैठो और रुको: जल्द ही या बाद में एक नया संस्करण जारी किया जाएगा (जो कमांड प्रतिस्थापन के अंदर बैश पूरा करने को भी ठीक कर सकता है) और आपको इसे भविष्य के कुछ उबंटू संस्करण के साथ मिलेगा। यही कारण है कि मैं ;-) के लिए जा रहा हूं