Linux में, कमांड टाइप करते समय यदि आप TAB को दो बार दबाते हैं, तो यह टाइप किए गए वर्णों से शुरू होने वाले सभी उपलब्ध कमांड को सूचीबद्ध करेगा।
यह कुछ नया नहीं है, शायद आप पहले से ही इसके बारे में जानते हैं। इस कार्यक्षमता को बैश कम्पलीशन कहा जाता है। बुनियादी फ़ाइल और डायरेक्टरी नाम कम्पलीशन डिफ़ॉल्ट रूप से बैश कमांड लाइन में उपलब्ध हैं।
लेकिन, हम इस बैश कम्पलीशन को टर्बो-चार्ज कर सकते हैं, और कम्प्लीट कमांड का उपयोग करके इसे अगले स्तर पर ले जा सकते हैं।
यह ट्यूटोरियल बताता है कि हम प्रोग्रामेबल कम्पलीशन का उपयोग करके विकल्पों और कमांड के आर्गुमेंट्स पर ऑटो-कम्पलीशन कैसे लागू कर सकते हैं।
उदाहरण के लिए, write कमांड टाइप करने के बाद, यदि आप टैब को दो बार दबाते हैं, तो ऑटो-कम्पलीशन write ऑपरेशन करने के लिए उपयोगकर्ताओं की सूची प्रदान करता है।
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
निम्नलिखित उदाहरण में, यह telnet कमांड के लिए उपलब्ध होस्टनाम दिखाएगा:
$ telnet [TAB][TAB] localhost dev-db fileserver
अपने टर्मिनल में प्रोग्रामेबल कम्पलीशन प्राप्त करने के लिए, आपको बस नीचे दिखाए अनुसार /etc/bash_completion चलाने की आवश्यकता है,
# . /etc/bash_completion
आप /etc/bash.bashrc में नीचे की लाइन्स को अनकमेंट भी कर सकते हैं (उबंटू लिनक्स 13.04 से) ताकि आपको ऊपर की कमांड को स्पष्ट रूप से न चलाना पड़े,
enable bash completion in interactive shells if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi
यदि आपको ये लाइनें और /etc/bash_completion फ़ाइल नहीं मिलती है, तो आपको केवल apt-get द्वारा bash_completion नामक पैकेज इंस्टॉल करना होगा।
1. मौजूदा बैश-कम्पलीशन देखें
प्रोग्रामेबल बैश कम्पलीशन सक्षम करने के बाद, बैश कम्पलीशन का एक सेट परिभाषित होता है। कम्प्लीट कमांड का उपयोग बैश कम्पलीशन को परिभाषित करने के लिए किया जाता है।
मौजूदा बैश कम्पलीशन देखने के लिए, नीचे दिखाए अनुसार कम्प्लीट कमांड का उपयोग करें।
complete -p | less
उपरोक्त उदाहरण में विकल्प -p वैकल्पिक है।
2. बैश में मानक कम्पलीशन की सूची
बैश डिफ़ॉल्ट रूप से लिनक्स उपयोगकर्ताओं के लिए निम्नलिखित मानक कम्पलीशन प्रदान करता है।
- वेरिएबलनाम कम्पलीशन
- यूजरनाम कम्पलीशन
- होस्टनाम कम्पलीशन
- पाथनाम कम्पलीशन
- फाइलनाम कम्पलीशन
हमने इन्हें अपने पहले के बैश स्टैंडर्ड कम्पलीशन लेख में चर्चा की थी।
3. कमांड प्राप्त करने के लिए कम्पलीशन परिभाषित करें
उपलब्ध कमांड की सूची को आर्गुमेंट के रूप में प्राप्त करने के लिए -c कमांड के साथ एक कम्पलीशन परिभाषित करें। निम्नलिखित उदाहरण में, कम्पलीशन को which कमांड के लिए परिभाषित किया गया है,
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
जैसा कि ऊपर देखा गया है, 'y' दबाने पर सभी कमांड सूचीबद्ध हो जाएंगे।
4. डायरेक्टरी प्राप्त करने के लिए कम्पलीशन परिभाषित करें
विकल्प d के साथ, कम्पलीशन को केवल डायरेक्टरी नामों को आर्गुमेंट के रूप में प्राप्त करने के लिए परिभाषित किया जा सकता है। निम्नलिखित उदाहरण में, ls के लिए कम्पलीशन परिभाषित किया गया है,
$ ls countfiles.sh dir1/ dir2/ dir3/ $ complete -d ls $ ls [TAB][TAB] dir1/ dir2/ dir3/
जैसा कि ऊपर देखा गया है, टैब दबाने पर केवल डायरेक्टरी दिखाई देती हैं।
5. बैकग्राउंड जॉब नाम प्राप्त करने के लिए कम्पलीशन परिभाषित करें
कम्प्लीट के साथ, जॉब नामों को कमांड के आर्गुमेंट के रूप में प्राप्त करना भी संभव है। विकल्प j का उपयोग कमांड जॉब के लिए आर्गुमेंट के रूप में जॉब नाम पास करने के लिए किया जाता है जैसा कि नीचे दिखाया गया है,
$ jobs [1]- Stopped cat [2]+ Stopped sed 'p' $ complete -j ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] cat sed
बैकग्राउंड जॉब्स के बारे में बात करते हुए, आपको इन उदाहरणों का उपयोग करके Linux बैकग्राउंड जॉब्स को प्रबंधित करना भी पता होना चाहिए।
6. प्रीफिक्स और सफ़िक्स के साथ कम्पलीशन
कम्पलीशन को वांछित प्रीफिक्स के साथ जोड़ा जा सकता है और वास्तविक कम्पलीशन के साथ जोड़ने के लिए सफ़िक्स। निम्नलिखित उदाहरण में, list_job_attrib.sh के लिए प्रीफिक्स और सफ़िक्स परिभाषित किया गया है,
$ jobs [1]+ Stopped cat $ complete -P '">' -S '<"' ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] $ ./list_job_attrib.sh ">cat<"
7. बहिष्करण के साथ फाइलनाम और डायरेक्टरी कम्पलीशन
मान लें कि स्क्रिप्ट अपना रन पूरा करती है, आउटपुट एक आउटपुट डायरेक्टरी में लिखा जाता है जैसा कि नीचे दिखाया गया है
$ cd output/ $ ls all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt parser_mod.tmp extract.o
ऊपर दिए गए में, यदि आपको ls कमांड के साथ ऑटो-कम्पलीशन के लिए .tmp और .o फ़ाइलों को अनदेखा करने की आवश्यकता है तो,
$ export FIGNORE='.tmp:.o' $ complete -f -d ls $ cd output $ ls [TAB][TAB] all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
FIGNORE वह शेल वेरिएबल है जिसमें फाइलनामों के सफ़िक्स होते हैं और वे ऑटो-कम्पलीशन में बाहर हो जाते हैं।
8. कम्पलीशन मान प्राप्त करने के लिए IFS द्वारा स्ट्रिंग विभाजित करें
वर्डलिस्ट को -W विकल्प के साथ उल्लेख किया जा सकता है और यह IFS वेरिएबल में मान से विभाजित हो जाता है। फिर प्रत्येक परिणामी शब्द विस्तारित होता है और कम्पलीशन के लिए प्रदर्शित होता है,
$ export IFS=" " $ complete -W "bubble quick" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
जैसा कि ऊपर बताया गया है, IFS डिलीमीटर द्वारा स्ट्रिंग को विभाजित करने के बाद, शब्द विस्तारित हो जाता है, इसलिए इन्हें वेरिएबल के रूप में रखना भी संभव है जैसा कि नीचे दिखाया गया है,
$ echo $SORT_TYPE1 bubble $ echo $SORT_TYPE2 quick $ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
9. कम्पलीशन उत्पन्न करने के लिए अपना खुद का फ़ंक्शन लिखें
यह आपको कम्पलीशन को परिभाषित करने के लिए एक फ़ंक्शन शामिल करने की अनुमति देता है। -F विकल्प के साथ, फ़ंक्शन का नाम कम्प्लीट कमांड को पास किया जाता है और यह कम्पलीशन उत्पन्न करने के लिए निष्पादित होता है। उदाहरण के लिए, फ़ंक्शन को नीचे दिखाए अनुसार लिखा जाता है,
_parser_options() { local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) ); }
जहां उपरोक्त फ़ंक्शन में,
- COMPREPLY: सरणी उन कम्पलीशन परिणामों को रखती है जो [TAB][TAB] दबाने के बाद प्रदर्शित होते हैं
- COMP_WORDS: कमांड लाइन पर टाइप किए गए शब्दों की सरणी
- COMP_CWORD: COMP_WORDS सरणी के लिए इंडेक्स और इसका उपयोग करके कमांड लाइन पर विभिन्न स्थिति शब्दों तक पहुंचा जा सकता है।
- compgen: -W संभावित कम्पलीशन रखता है और संबंधित आर्गुमेंट को $current_arg के आधार पर चुना जाता है
यह फ़ंक्शन parser_option फ़ाइल में मौजूद है जिसे नीचे दिखाए अनुसार सोर्स किया जाता है,
$ source parser_option
इस फ़ंक्शन को अपने पार्सर स्क्रिप्ट से नीचे दिखाए अनुसार लिंक करें,
$ complete -F _parser_options ./parser.pl $ ./parser.pl [TAB][TAB] -i --incoming -o --outgoing -m --missed
जैसा कि ऊपर देखा गया है, पार्सर्स के विकल्प _parser_options() फ़ंक्शन द्वारा उत्पन्न होते हैं।
नोट: प्रोग्रामेबल कम्पलीशन के लिए अधिक फ़ंक्शन देखने के लिए /etc/bash_completion देखें।
10. प्राथमिक कोई उत्पन्न न करे तो द्वितीयक स्पेक
यदि परिभाषित कम्पलीशन स्पेसिफिकेशन द्वारा कोई मैच उत्पन्न नहीं होता है, तो -o विकल्प के साथ उल्लिखित कम्प-ऑप्शन को कम्पलीशन के लिए लिया जाता है।
$ complete -F _count_files -o dirnames ./countfiles.sh
ऊपर, कम्पलीशन को ./countfiles.sh फ़ाइल के लिए _count_files फ़ंक्शन के साथ परिभाषित किया गया है। यदि _count_files() फ़ंक्शन कोई मैच उत्पन्न नहीं करता है तो डायरेक्टरी कम्पलीशन का प्रयास किया जाता है।
$ ls countfiles.sh dir1/ dir2/ dir3/ $./countfiles.sh [TAB][TAB] dir1 dir2 dir3