मैं हाल ही में शेल में बहुत समय बिता रहा हूं और मैं सोच रहा हूं कि टैब स्वत: पूर्ण कैसे काम करता है। इसके पीछे क्या तंत्र है? बैश हर डायरेक्टरी की सामग्री को कैसे जानता है?
मैं हाल ही में शेल में बहुत समय बिता रहा हूं और मैं सोच रहा हूं कि टैब स्वत: पूर्ण कैसे काम करता है। इसके पीछे क्या तंत्र है? बैश हर डायरेक्टरी की सामग्री को कैसे जानता है?
जवाबों:
स्वतः पूर्णता के दो भाग हैं:
रीडलाइन लाइब्रेरी, जैसा कि पहले से ही तय किया गया था, जिसे पहले से तय किया गया था, कमांड लाइन संपादन का प्रबंधन करता है, और टैब को दबाए जाने पर बैश करने के लिए वापस बुलाता है, ताकि पूरा होने में सक्षम हो सके। बैश तो देता है संभव प्राप्तियों और 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
।
/etc/bash_completion
(कम से कम, यही वह जगह है जहां बहुत सारा जादू डेबियन में है)।