Linux में, एक कमांड टाइप करते समय यदि आप TAB को दो बार दबाते हैं, तो यह सभी उपलब्ध कमांडों को सूचीबद्ध करेगा जो टाइप किए गए वर्णों से शुरू होते हैं।
यह कोई नई बात नहीं है, शायद आप इस बारे में पहले से ही जानते हों। इस कार्यक्षमता को बैश पूर्णता कहा जाता है। मूल फ़ाइल और निर्देशिका नाम पूर्णता बैश कमांड लाइन में डिफ़ॉल्ट रूप से उपलब्ध हैं।
लेकिन, हम इस बैश पूर्णता को टर्बो-चार्ज कर सकते हैं, और इसे पूर्ण कमांड का उपयोग करके अगले स्तर तक ले जा सकते हैं।
यह ट्यूटोरियल बताता है कि प्रोग्रामेबल कंप्लीशन का उपयोग करके हम विकल्पों और कमांड के तर्कों के लिए स्वत:पूर्णता कैसे लागू कर सकते हैं। ऑपरेशन लिखने के लिए।
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
निम्नलिखित उदाहरण में, यह टेलनेट कमांड के लिए उपलब्ध होस्टनाम दिखाएगा:
$ telnet [TAB][TAB] localhost dev-db fileserver
अपने टर्मिनल में प्रोग्राम योग्य पूर्णता प्राप्त करने के लिए, आपको बस /etc/bash_completion चलाने की आवश्यकता है जैसा कि नीचे दिखाया गया है,
# . /etc/bash_completion
आप नीचे दी गई पंक्तियों को /etc/bash.bashrc(ubuntu linux 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 नामक पैकेज को स्थापित करने की आवश्यकता है
<एच3>1. मौजूदा बैश-पूर्णता देखेंप्रोग्राम करने योग्य बैश पूर्णता को सक्षम करने के बाद, परिभाषित बैश पूर्णता के सेट हैं। पूर्ण कमांड का उपयोग बैश पूर्णता को परिभाषित करने के लिए किया जाता है।
मौजूदा बैश पूर्णता को देखने के लिए, नीचे दिखाए अनुसार पूर्ण कमांड का उपयोग करें।
complete -p | less
उपरोक्त उदाहरण में विकल्प -p वैकल्पिक है।
<एच3>2. बैश में मानक पूर्णता की सूचीबैश डिफ़ॉल्ट रूप से लिनक्स उपयोगकर्ताओं के लिए निम्नलिखित मानक पूर्णता प्रदान करता है।
- चर नाम पूरा करना
- उपयोगकर्ता नाम पूर्णता
- होस्टनाम पूर्णता
- पथनाम पूर्णता
- फ़ाइल नाम पूर्णता
हमने इनके बारे में अपने पहले बैश मानक समापन लेख में चर्चा की थी।
<एच3>3. कमांड प्राप्त करने के लिए पूर्णता को परिभाषित करेंउपलब्ध कमांड की सूची को तर्क के रूप में प्राप्त करने के लिए -c कमांड के साथ पूर्णता को परिभाषित करें। निम्नलिखित उदाहरण में, पूर्णता को किस कमांड के लिए परिभाषित किया गया है,
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
जैसा कि ऊपर देखा गया है, 'y' दबाने से सभी कमांड सूचीबद्ध हो जाएंगे।
<एच3>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
पृष्ठभूमि नौकरियों के बारे में बात करते हुए, आपको यह भी पता होना चाहिए कि इन उदाहरणों का उपयोग करके लिनक्स पृष्ठभूमि नौकरियों को कैसे प्रबंधित किया जाए।
<एच3>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<"<एच3>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 देखें।
<एच3>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