डिबग कैसे करें और बैश में धीमे स्वत: पूर्ण कैसे करें?


26

एक हालिया अपडेट (उबंटू 12.04 एलटीएस) के बाद, कमांड लाइन पर टीएबी पूरा धीमा है। एक आंशिक कमांड (जैसे evi [TAB]) या आंशिक फ़ाइल नाम (जैसे evince somedocu[TAB]) दर्ज करने के बाद शेल, कभी-कभी हालांकि हमेशा नहीं, कई सेकंड तक लटका रहता है।

व्यक्तिगत रूप से, मैं धीमी गति से कम शक्तिशाली स्वत: पूर्णता पसंद करूंगा। वहाँ एक साधारण तय है?

संपादित करें: टिप्पणियों से संबंधित अतिरिक्त जानकारी:

  • पथ सुंदर मानक है। ~ / बिन में कुछ बैश स्क्रिप्ट हैं

    $ echo $PATH
    /home/USERNAME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
    
  • कार्यशील निर्देशिका में फ़ाइलों की संख्या 100 से कम है।

  • विशेष रूप से असामान्य डिस्क गतिविधि (सिस्टम अपग्रेड) के बाद स्वत: पूर्ण सुविधा धीमी थी। इस प्रकार, यह संभव है, कि rereading / usr / bin और अन्य निर्देशिकाओं ने अंतराल का कारण बना।

4
क्या ऐसा नहीं है कि आप अपडेट के साथ अपने हार्ड ड्राइव की गति प्रबंधन को सक्षम करते हैं, और यह कि स्वत: पूर्ण डिस्क की प्रतीक्षा करता है ताकि ऑटोकंप्लीशन की गणना करने में सक्षम हो?
विन्सेन्ट निवलियर्स

2
क्या यह निर्भर करता है कि आपकी वर्तमान निर्देशिका में कितनी फाइलें हैं?
terdon

1
# इको ​​$ PATH क्या कहता है? यदि आपके पास पथ में निर्देशिकाओं में कई (कई दसियों हज़ारों या अधिक) फाइलें हैं, तो इसका कारण हो सकता है।
Stephan

जवाबों:


28

मैं फिक्सिंग के बारे में नहीं जानता - सभी प्रकार की चीजें हैं जो देरी का कारण बन सकती हैं। लेकिन मैं जांच के लिए कुछ सुझाव दे सकता हूं।

एक अनुमान के रूप में, शायद एक खोज पथ में कहीं निर्देशिका है ( $PATHया, या जहां डेटा को पूरा करने के लिए बैश दिखता है) एक फाइलसिस्टम पर प्रतिक्रिया करने के लिए धीमा है। आमतौर पर यह सुदूर फाइलसिस्टम है जो धीमा है, लेकिन यह एक असफल हार्ड डिस्क, एक भूखा ड्राइवर, आदि भी हो सकता है।

जांच का पहला चरण set -xउन कमांडों का पता लगाने के लिए चलाना है जो शेल पूर्णता उत्पन्न करने के लिए निष्पादित करते हैं। जहां देखो वहीं थम जाता है।

यदि वह पर्याप्त जानकारी नहीं देता है, तो बड़ी तोपों को लाएं। शेल की प्रक्रिया आईडी ( echo $$) पर ध्यान दें । किसी अन्य टर्मिनल में, रन strace -f -s9999 -p$$(या स्ट्रेस के बराबर यदि किसी अन्य यूनिक्स स्वाद पर चल रहा है)। स्ट्रेस प्रक्रिया द्वारा निष्पादित सिस्टम कॉल को सूचीबद्ध करता है। देखें कि क्या यह उन फ़ाइलों तक पहुँच प्राप्त करता है जो इसे नहीं करना चाहिए, या यदि कुछ फ़ाइलों तक पहुँच धीमी है। विकल्प जोड़ने -Tके लिए straceआदेश पंक्ति यह समय प्रत्येक सिस्टम कॉल में खर्च दिखाने बनाता है।


1
मैं यूनिक्स का उपयोग कर रहा हूं और इस बारे में नहीं जानता था कि यह set -xकैसा कूल कमांड है। बहुत "हैकर मोड लगे"
मैट फ्लेचर

6
पीएस, set +xसामान्य गैर-डिबग मोड पर लौटने का उपयोग करें
मैट फ्लेचर

19

यदि आपका * निक्स बॉक्स LDAP क्लाइंट के रूप में सेटअप है, तो आपको यह समस्या हो सकती है, यहां तक ​​कि स्थानीय उपयोगकर्ता के रूप में भी लॉग इन किया जा सकता है।

डिबगिंग बोरिंग जानकारी: डिबगिंग के साथ set-x, मैंने पूरा किया जो कि लटक रहा था:

> set -x
> ls foo<tab>
...                     <--- lots of output removed
...
+ _quote_readline_by_ref foo quoted
+ '[' -z foo ']'
+ [[ foo == \'* ]]      <--- froze here
+ [[ foo == ~* ]]       <--- actually causing the trouble

पुष्टि करें: मैंने इसकी पुष्टि की ls ~*जिसके साथ यह भी लटका हुआ है। यह पता चला है कि मेरा ldap सर्वर सुस्त था, लेकिन इससे बैश पूरा होने और ls जैसी चीजों को प्रभावित नहीं होना चाहिए!

समाधान: अहा, बैश-समापन + ldap के खिलाफ एक बग दर्ज किया गया है , यह एक नए संस्करण में तय किया जाएगा, और एक साधारण पैच यदि आप इंतजार नहीं करना चाहते हैं। टैब पूरा होना फिर से तेज़ है, हुर्रे!

यहां लिंक के चले जाने की स्थिति में पैचफ़ाइल है। यह केवल 545 और 547 की तर्ज पर ~ बच रहा है:

--- /usr/share/bash-completion/bash_completion.orig 2014-11-06 10:36:14.981888369 +0100
+++ /usr/share/bash-completion/bash_completion  2014-11-06 10:36:25.142070963 +0100
@@ -542,9 +542,9 @@
     elif [[ $1 == \'* ]]; then
         # Leave out first character
         printf -v $2 %s "${1:1}"
-    elif [[ $1 == ~* ]]; then
+    elif [[ $1 == \~* ]]; then
         # avoid escaping first ~
-        printf -v $2 ~%q "${1:1}"
+        printf -v $2 \~%q "${1:1}"
     else
         printf -v $2 %q "$1"
     fi

इस पैच को प्रभावी करने के लिए आपको वर्तमान ssh सत्र से बाहर निकलने और पुनः लॉगिन करने की आवश्यकता है।


1
मेरे पास यह सटीक समस्या थी और पैच अच्छा है
रेडमैन

2
यहाँ एक ही समस्या (डेबियन 8.5) 2 1/3 साल पहले और समाधान एक आकर्षण की तरह काम करता है। डेबियन 8.6 की समस्या नहीं है।
योमीसो

2
मैंने सेट -xa मिलियन बार उपयोग किया है, फिर भी मुझे उम्मीद नहीं थी कि यह भी पूरा होने के प्रदर्शन के मुद्दों को दिखाएगा, बहुत बहुत धन्यवाद!
मार्क

डेबियन 9.8 के साथ यह समस्या थी!
फिलिप गाचौड

0

बैश-पूर्ति को पुनः स्थापित करने का प्रयास करें

sudo apt-get install --reinstall bash-completion

मेरे लिए यह उबंटू 18.04.3 LTS में तय किया गया है


0

इसके अलावा कुछ लोग अतिरिक्त ऑटो पूर्ण सुविधाओं का उपयोग करते हैं जैसे गिट बैश ऑटो पूर्ण । बैश समापन सुस्ती उन अतिरिक्त ऑटो पूर्ण सुविधाओं के दुर्व्यवहार का एक परिणाम हो सकता है।

मेरे मामले में यह git bash auto complete था, मेरी git सार्वजनिक कुंजी को अपडेट कर दिया गया था, इसलिए यह एक हैंगिंग प्रमाणीकरण प्रयास को विफल कर रहा था। एक बार मैंने ऑटो को पूरा निकाल दिया, फिर से तेज था। तो मेरा समाधान मेरी कुंजी को ठीक करना और इसे फिर से सक्षम करना था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.