बैश टैब पूर्णता: '-बैश: अनपेक्षित EOF को मिलान के लिए खोजते हुए `) -बश: वाक्यविन्यास त्रुटि: फ़ाइल का अंत


18

मैं irbइस कमांड वाली फ़ाइल से विशिष्ट पर्यावरण चर के साथ एक सत्र में जाने की कोशिश कर रहा हूँ :

$ env $(cat env.sh) irb

लेकिन जब मैं इसे पूरा करने के लिए Tabटाइप env.करने के बाद प्रेस करने की कोशिश करता हूं , तो मुझे यह निम्न त्रुटि मिलती है:

$ env $(cat env.-bash: unexpected EOF while looking for matching `)'
-bash: syntax error: unexpected end of file

एक और दिलचस्प बात यह है कि अगर मैं रूट के रूप में लॉग इन हूं, तो यह त्रुटि नहीं होती है।

यहाँ का उत्पादन है find ~ -uid 0:

$ find ~ -uid 0
/home/(redacted)/.rpmdb
/home/(redacted)/.rpmdb/Group
/home/(redacted)/.rpmdb/Conflictname
/home/(redacted)/.rpmdb/Installtid
/home/(redacted)/.rpmdb/Sha1header
/home/(redacted)/.rpmdb/Providename
/home/(redacted)/.rpmdb/__db.002
/home/(redacted)/.rpmdb/Requirename
/home/(redacted)/.rpmdb/Sigmd5
/home/(redacted)/.rpmdb/__db.001
/home/(redacted)/.rpmdb/Obsoletename
/home/(redacted)/.rpmdb/.dbenv.lock
/home/(redacted)/.rpmdb/Name
/home/(redacted)/.rpmdb/Basenames
/home/(redacted)/.rpmdb/Triggername
/home/(redacted)/.rpmdb/Packages
/home/(redacted)/.rpmdb/Dirnames
/home/(redacted)/.rpmdb/__db.003

क्या कोई मुझे समझा सकता है कि ऐसा क्यों हो रहा है और यदि हां, तो मैं इसे कैसे ठीक कर सकता हूं जब मैं रूट उपयोगकर्ता नहीं हूं?


आप रूट के रूप में कैसे लॉग इन करते हैं?
मुरु

@ muru मैंने रूट का उपयोग करके लॉग इन किया sudo su
एल्डोसोआ

के आउटपुट को जोड़ने के लिए कृपया अपने प्रश्न को संपादित करें find ~ -uid 0
मुरु

@ ममरू हो गया। मेरे सवाल में आउटपुट जोड़ा गया।
एल्डोसोआ

इस बारे में क्षमा करें, लेकिन जड़ के रूप में नहीं! मेरा मतलब आपके सामान्य उपयोगकर्ता के रूप में है, इसलिए यह ~है /home/something
मुरु

जवाबों:


33

आपको उबास द्वारा उपयोग की जाने वाली बैश कम्प्लीशन लाइब्रेरी में एक बग मिला ।

इसका क्या मतलब है?

उबंटू बश पूरा होने वाले पुस्तकालय को स्मार्ट बनाने के लिए उपयोग करता है। यह लाइब्रेरी में रहता है /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हैक एक अन्य समस्या को ठीक करने वाला था , लेकिन मुझे लगता है कि इसने इस प्रक्रिया में अन्य बग को पेश किया।

मैं इसे कैसे ठीक करूं?

यह पता चला है कि यह बग पहले ही सूचित किया जा चुका है । उस बग रिपोर्ट को पढ़ने के बाद, मुझे इसे ठीक करने के तीन तरीके दिखाई देते हैं:

  1. इसे पैच करें: उस बग रिपोर्ट की टिप्पणियों में, कोई व्यक्ति लाइन को बदलने का सुझाव देता है

    [[ ${!2} == \$* ]] && eval $2=${!2}

    _quote_readline_by_refफ़ाइल /usr/share/bash-completion/bash_completionमें लाइन द्वारा फ़ंक्शन

    [[ ${!2} == \$\'* ]] && eval $2=${!2}

    मैं ऐसा करने के खिलाफ सलाह देता हूं। जिस व्यक्ति ने वह टिप्पणी लिखी है, वह बैश-समापन का डेवलपर नहीं प्रतीत होता है । यह हॉटफ़िक्स केवल कथन के बाएँ ऑपरेंड को गलत का मूल्यांकन करने का कारण बनेगा और इस प्रकार ऐसा होने evalसे रोकेगा । हालाँकि उस कार्य को क्या करना चाहिए और इसे किस संदर्भ में कहा जाता है, इस बारे में अच्छी जानकारी के बिना, यह स्पष्ट नहीं है कि क्या यह संभावित रूप से कुछ अन्य अपेक्षित कार्यक्षमता को नहीं तोड़ेगा।

  2. नवीनतम संस्करण प्राप्त करें: जैसा कि उस बग रिपोर्ट में भी उल्लेख किया गया है, यह बग गिट हेड (जिसमें अन्य परिवर्तनों के बीच फ़ंक्शन _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 में टूट गया है।

  1. वापस बैठो और रुको: जल्द ही या बाद में एक नया संस्करण जारी किया जाएगा (जो कमांड प्रतिस्थापन के अंदर बैश पूरा करने को भी ठीक कर सकता है) और आपको इसे भविष्य के कुछ उबंटू संस्करण के साथ मिलेगा। यही कारण है कि मैं ;-) के लिए जा रहा हूं

1
@ con-f- यूप का उपयोग करें, बस! गिट रेपो भी बैश-समापन की मुख्य साइट से जुड़ा हुआ है , यही वजह है कि मैंने अपने उत्तर में इसे लिंक नहीं किया था।
माल्टे स्कोरुप्पा

2
@ con-f-use आपकी टिप्पणी ने मुझे इस बग पर कुछ और शोध करने के लिए प्रेरित किया। यह पता चला है कि यह नहीं है, और कभी नहीं, एक अपस्ट्रीम बग था। इसके बजाय, यह वास्तव में एक बग है जिसे उबंटू पैच ने अपस्ट्रीम संस्करण के खिलाफ लागू किया है। ऐसा प्रतीत होता है कि इस बग को अब तक उस विशेष पैच तक सीमित कर दिया गया है। इसलिए मैंने अपनी खोज को उबंटू बग रिपोर्ट में दर्ज किया है: बगैसलांचपडॉट.नेट / बुंटू / +सोर्स / bash-completion / + bug/ 1312243
माल्ट स्कोर्पुपा

2
अच्छा काम मालटे।
बैरी केली

1
स्पष्टीकरण के लिए धन्यवाद। इस लेखन के रूप में, git हेड संस्करण ने बग और स्वतः पूर्णता को वांछित रूप से हटा दिया है । संपादित करें: वास्तव में, कोई बात नहीं, यह नहीं है।
user3391564

1
@MaxvonHippel मैंने कहा कि जब आप sudo suरूट बनने के लिए उपयोग करते हैं, तो यह लाइब्रेरी को स्रोत नहीं बनाता है , लेकिन जब आप इसके बजाय उपयोग करते हैं, तो यह खट्टा हो जाएगाsudo -i , जो कि एक इंटरेक्टिव रूट सत्र प्राप्त करने का इच्छित तरीका है। आपके प्रश्न के लिए: चूंकि कोई भी बैश शेल पढ़ता है, ~/.bashrcजो अंततः लाइब्रेरी का स्रोत होता है, और किसी फ़ाइल को "अन-सोर्स" करने का कोई तरीका नहीं है, मुझे कोई पूरी तरह से सीधा रास्ता दिखाई नहीं देता है। यहाँ एक संभव हैक है: कुछ वातावरण चर पर पुस्तकालय सशर्त के स्रोतों बनाओ, कहते हैं, NOCOMPL, नहीं अपने में परिभाषित किया जा रहा ~/.bashrc...
Malte Skoruppa
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.