बैश टैब पूरा होने का काम कैसे करता है?


113

मैं हाल ही में शेल में बहुत समय बिता रहा हूं और मैं सोच रहा हूं कि टैब स्वत: पूर्ण कैसे काम करता है। इसके पीछे क्या तंत्र है? बैश हर डायरेक्टरी की सामग्री को कैसे जानता है?


2
आप जांच करना चाहते हैं /etc/bash_completion(कम से कम, यही वह जगह है जहां बहुत सारा जादू डेबियन में है)।
व्रिकेन

1
@Wrikken: यह bash_completion है, जो टैब के पूरा होने पर निर्भर है लेकिन ऐसा नहीं है।
इग्नासियो वाज़केज़-अब्राम्स

जवाबों:


101

स्वतः पूर्णता के दो भाग हैं:

  • रीडलाइन लाइब्रेरी, जैसा कि पहले से ही तय किया गया था, जिसे पहले से तय किया गया था, कमांड लाइन संपादन का प्रबंधन करता है, और टैब को दबाए जाने पर बैश करने के लिए वापस बुलाता है, ताकि पूरा होने में सक्षम हो सके। बैश तो देता है संभव प्राप्तियों और ReadLine आवेषण की एक सूची (अगले अंक देखें) के रूप में ज्यादा के रूप में वर्ण पहले से ही में टाइप द्वारा स्पष्ट रूप से पहचाने जाते हैं। (आप काफी ज्यादा ReadLine पुस्तकालय कॉन्फ़िगर कर सकते हैं, को देखने के अनुभाग कमांड लाइन संपादन बैश की विवरण के लिए मैनुअल।)

  • बैश में ही completeव्यक्तिगत कमांड के लिए एक पूरा तंत्र को परिभाषित करने के लिए अंतर्निहित है । यदि वर्तमान कमांड के लिए कुछ भी परिभाषित नहीं है, तो यह फ़ाइल नाम (ओपेंडिर / रीडिर का उपयोग करके पूरा करने का उपयोग करता है, जैसा कि इग्नासियो ने कहा है)।

    अपनी स्वयं की पूर्णताओं को परिभाषित करने वाला भाग, प्रोग्रामेबल कम्पलीशन में सेक्शन में वर्णित है । संक्षेप में, complete «options» «command»आप कुछ कमांड के पूरा होने को परिभाषित करते हैं। उदाहरण के लिए complete -u suकहते हैं जब के लिए एक तर्क को पूरा suआदेश, मौजूदा प्रणाली के उपयोगकर्ताओं के लिए खोज

    यदि यह सामान्य विकल्पों की तुलना में अधिक जटिल है (जैसे तर्क सूचकांक के आधार पर अलग-अलग पूर्णताओं को कवर कर सकते हैं, या पिछले तर्कों के आधार पर), तो आप उपयोग कर सकते हैं -F function, जो तब संभावित पूर्णताओं की सूची बनाने के लिए एक शेल फ़ंक्शन को आमंत्रित करेगा। (यह उदाहरण के लिए git पूरा करने के लिए उपयोग किया जाता है, जो बहुत जटिल है, जो सब-कॉम्प्लेक्स पर और कभी-कभी दिए गए विकल्पों पर निर्भर करता है, और कभी-कभी शाखाओं के नामों का उपयोग करते हुए (जो कि कुछ भी बाश के बारे में नहीं जानते हैं)।

आप अपने वर्तमान बैश वातावरण में परिभाषित मौजूदा पूर्णताओं को सरलता से उपयोग कर सकते हैं complete, जो कि संभव है, उस पर प्रभाव डाल सकते हैं। यदि आपके पास बैश-समापन पैकेज स्थापित है (या हालांकि यह आपके सिस्टम पर नाम दिया गया है), तो बहुत सारे कमांड के लिए पूर्णताएं स्थापित की जाती हैं, और जैसा कि विरिकन ने कहा, /etc/bash_completionइसमें एक बैश स्क्रिप्ट शामिल है जिसे तब कॉन्फ़िगर करने के लिए अक्सर शेल स्टार्टअप पर निष्पादित किया जाता है। अतिरिक्त कस्टम समापन स्क्रिप्ट को रखा जा सकता है /etc/bash_completion.d; उन सभी से sourced रहे हैं /etc/bash_completion


1
मैन पेज केवल स्वतंत्र कमांड के लिए हैं, शेल बिल्डरों के लिए नहीं। लेकिन यह मेरे द्वारा लिंक किए गए बैश मैनुअल का हिस्सा है।
पाओलो एबरमन

7

यदि आप मूल बातों में रुचि रखते हैं: बैश रीडलाइन का उपयोग करता है जिसमें इतिहास और बुनियादी पूर्णता शामिल है। यदि आप विस्तृत समझ प्राप्त करना चाहते हैं तो आप स्रोत का निरीक्षण कर सकते हैं। इसके अलावा, आप अपने स्वयं के सीएलआई इंटरफेस को पूरा करने के लिए रीडलाइन का उपयोग कर सकते हैं

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