बैश शेल निश्चित रूप से एकमात्र शेल नहीं है, लेकिन यह सबसे शक्तिशाली में से एक है। यह सिस्टम प्रशासकों के लिए एक लोकप्रिय विकल्प बनाता है जिन्हें गंभीर अनुप्रयोगों को विकसित करने की आवश्यकता होती है जो सिस्टम पर चलने के लिए कमांड की एक साधारण "लॉन्ड्री सूची" से परे जाते हैं। अन्य गोले के लिए बहुत सारे महान उपयोग हैं (उदाहरण के लिए, मैं गिट हुक के लिए Tcsh के लिए डिफ़ॉल्ट), लेकिन गंभीर स्क्रिप्टिंग के लिए बैश एक आसान विकल्प है, और यहाँ क्यों है।
कार्य
बैश स्क्रिप्ट में फ़ंक्शन बनाने के लिए, कीवर्ड फ़ंक्शन . का उपयोग करें :
function foo {
# code here
}
फंक्शन प्रोग्रामर्स के लिए उपयोगी होते हैं क्योंकि वे कोड में अतिरेक को कम करने में मदद करते हैं। कोड में कम अतिरेक आवश्यक रखरखाव की मात्रा को कम करता है क्योंकि यदि आपको किसी मान को बदलने की आवश्यकता है, तो आपको इसे हर बार उपयोग किए जाने के बजाय केवल एक बार (इसके कार्य में) खोजना होगा।
बैश कैसे स्टैक करता है
Tcsh के उल्लेखनीय अपवाद के साथ, शेल में फ़ंक्शंस काफी अच्छी तरह से समर्थित हैं।
- कॉर्न खोल: बैश के समान सिंटैक्स का उपयोग करता है
- Zsh: बैश के समान सिंटैक्स का उपयोग करता है
- मछली: एक कस्टम फ़ंक्शन . का उपयोग करता है कार्यों को बनाने और उनमें हेरफेर करने का आदेश
- टीसीएसएच: कभी-कभी, आप गोटो . का उपयोग करके Tcsh में फ़ंक्शन की कमी के आसपास काम कर सकते हैं कथन, लेकिन यह शायद ही कभी इष्टतम विकल्प है।
पुनर्निर्देशन
इनपुट और आउटपुट का पुनर्निर्देशन किसी भी प्रोग्रामिंग और स्क्रिप्टिंग भाषा में एक सुंदर मानक कार्य है, और यह स्वाभाविक रूप से तब होता है जब आप एक शेल का उपयोग कर रहे होते हैं। आप पाठ इनपुट करते हैं; आपको आउटपुट मिलता है। कुछ गोले दूसरों की तुलना में अधिक मजबूत होते हैं, और जैसा कि आप अनुमान लगा सकते हैं, बैश आपको लगभग हर विकल्प की कल्पना करता है।
मूल बातें सरल हैं:कुछ संख्या में > . का उपयोग करें आउटपुट को पुनर्निर्देशित करने के लिए वर्ण और कुछ संख्या < इनपुट रीडायरेक्ट करने के लिए वर्ण। हालांकि, विशिष्ट प्रकार के इनपुट और आउटपुट के लिए कुछ विशेष पदनाम हैं। उदाहरण के लिए, त्रुटि संदेश stderr . नामक स्ट्रीम में जाते हैं , जिसे 2> . के रूप में निर्दिष्ट किया गया है पुनर्निर्देशन के प्रयोजनों के लिए। उदाहरण के लिए, यह आदेश त्रुटि संदेशों को output.log . नामक फ़ाइल पर निर्देशित करता है :
$ ls /void 2> output.log
बैश कैसे ढेर होता है
पुनर्निर्देशन एक शेल के साथ बातचीत करते समय एक महान सुविधा कार्य है, और जबकि सभी प्रमुख शेल किसी न किसी तरीके से पुनर्निर्देशन का समर्थन करते हैं, सभी शेल में सभी सुविधाएँ उपलब्ध नहीं होती हैं।
- कॉर्न खोल: बैश के समान सिंटैक्स का उपयोग करता है
- Zsh: बैश के समान सिंटैक्स का उपयोग करता है
- मछली: आंशिक समर्थन
- टीसीएसएच: आंशिक समर्थन
स्रोत
जब आप किसी फ़ाइल को शेल में स्रोत करते हैं, तो आप फ़ाइल को अपने शेल परिवेश में आयात कर रहे होते हैं। अधिकांश शेल इसे कुशलता से संभालते हैं, लेकिन कुछ आपकी सुविधा के लिए कुछ अतिरिक्त सुविधाएँ प्रदान करते हैं।
उदाहरण के लिए, जब आप स्रोत . का उपयोग करते हैं बैश में, यह आपके द्वारा संदर्भित फ़ाइल के लिए आपकी वर्तमान निर्देशिका खोजता है। यदि यह फ़ाइल को स्रोत पर नहीं ढूंढ पाता है, तो यह इसके बजाय आपके PATH को खोजता है। यह एक छोटा बोनस है, लेकिन यह इतना सुविधाजनक है क्योंकि यह आपको अपने ड्राइव पर एक केंद्रीकृत स्थान में सामान्य कार्यों को संग्रहीत करने की अनुमति देता है और फिर अपने पर्यावरण को एक एकीकृत विकास वातावरण (आईडीई) की तरह मानता है। आपको इस बारे में चिंता करने की ज़रूरत नहीं है कि आपके फ़ंक्शन कहाँ संग्रहीत हैं, क्योंकि आप जानते हैं कि वे /usr/include के आपके स्थानीय समकक्ष में हैं। , इसलिए कोई फर्क नहीं पड़ता कि आप कहां हैं जब आप उन्हें स्रोत करते हैं, बैश उन्हें ढूंढता है।
बैश कैसे ढेर होता है
बैश एकमात्र ऐसा शेल है जो वर्तमान निर्देशिका और आपके PATH . दोनों को खोजता है जब आप स्रोत . का उपयोग करते हैं कमांड या संक्षिप्त (और POSIX-ly सही) । संकेतन।
कुंजी बाइंडिंग
कई शेल आपको अनुकूलित करने की अनुमति देते हैं कि आप उनके साथ कैसे इंटरैक्ट करते हैं, और निश्चित रूप से, टेक्स्ट-आधारित इंटरफ़ेस के साथ कोई भी इंटरैक्शन टाइपिंग से शुरू होता है। बैश में, आप अपना वर्तमान कीमैप देख सकते हैं:
$ bind -V | grep keymap
अपना कीमैप बदलने के लिए (उदाहरण के लिए Emacs से Vi में):
$ bind 'set keymap vi'
बैश कैसे ढेर होता है
केवल बैश और ज़श कुंजी बाइंडिंग के लिए बिल्ट-इन प्रीसेट प्रदान करते हैं।
इतिहास
बैश में किसी भी शेल का सबसे मजबूत कमांड-इतिहास इंटरफ़ेस है। इतिहास . का बैश संस्करण रिवर्स सर्च, क्विक रिकॉल, हिस्ट्री एडिटिंग (लाइन नंबर द्वारा प्रविष्टियों को हटाने सहित) और बहुत कुछ की अनुमति देता है। अन्य सभी गोले संयुक्त रूप से बैश के इतिहास इंटरफ़ेस से मेल खाते हैं, लेकिन कोई भी (यहां तक कि Zsh, जो आम तौर पर बैश की नकल करता है) अपने आप से मेल नहीं खाता।
इतिहास में हेरफेर
इतिहास आदेश आपके अतीत के साथ बातचीत करने का एकमात्र तरीका नहीं है। बैश में शॉर्टहैंड नोटेशन का एक समृद्ध संग्रह है जो आपको अपने शेल इतिहास में कमांड को याद करने और यहां तक कि संशोधित करने में सक्षम बनाता है।
उदाहरण के लिए, नवीनतम कमांड को फिर से चलाने के लिए ( history | tail -n1 का आउटपुट) , एक अग्रणी स्पेस . का उपयोग करके , यहां . द्वारा निर्दिष्ट किया गया है , इतिहास कमांड को अपने इतिहास से बाहर रखने के लिए), आप बस टाइप कर सकते हैं !! बैश में:
$ wc -w luarocks.xml
1284 luarocks.xml
$ !!
1284 luarocks.xml
उस कमांड के हिस्से को किसी और चीज़ से बदलते हुए सबसे हालिया कमांड को चलाने के लिए, आप स्ट्रिंग प्रतिस्थापन का उपयोग कर सकते हैं:
$ wc -w luarocks.xml
1284 luarocks.xml
$ ^-w^-l
$ wc -l luarocks.xml
214 luarocks.xml
ऐसे कई शॉर्टकट हैं, उन सभी को बैश मैन और सूचना पृष्ठों में प्रलेखित किया गया है। बेशक, इनमें से कई तरकीबें उन्नत उपयोगकर्ताओं के लिए हैं, जिनके लिए बैश इंटरैक्शन इतना दोहराव और सांसारिक है कि अस्पष्ट, प्रतीत होता है कि यादृच्छिक कुंजी संयोजन उपयोगी हैं। Zsh प्रभावी रूप से बैश की नकल करता है, लेकिन कोई अन्य शेल इस तरह की अधिकतम दक्षता प्रदान नहीं करता है।
बैश कैसे ढेर होता है
बैश के इतिहास कमांड किसी भी अन्य शेल से बेजोड़ हैं (Zsh करीब आता है, लेकिन कुछ विकल्पों की कमी है, जैसे लाइन नंबर से हटाने की क्षमता)।
सहयोगी सरणियाँ
अधिकांश गोले अनुक्रमित सरणियों को बनाने, हेरफेर करने और क्वेरी करने की क्षमता प्रदान करते हैं। सादे अंग्रेजी में, एक अनुक्रमित सरणी एक संख्या के साथ उपसर्ग वाली चीजों की एक सूची है। चीजों की यह सूची, उनकी नियत संख्या के साथ, आसानी से एक ही चर में लपेटी जाती है, जिससे इसे आपके कोड में "कैरी" करना आसान हो जाता है।
हालाँकि, बैश में साहचर्य सरणियाँ बनाने की क्षमता शामिल है और इन सरणियों को किसी अन्य सरणी के समान माना जाता है। एक सहयोगी सरणी आपको केवल क्रमांकित मानों के बजाय कुंजी और मान जोड़े की सूचियां बनाने देती है।
साहचर्य सरणियों के बारे में अच्छी बात यह है कि कुंजियाँ मनमानी हो सकती हैं:
$ declare -A userdata
$ userdata[name]=seth
$ userdata[pass]=8eab07eb620533b083f241ec4e6b9724
$ userdata[login]=`date --utc +%s`
कोई भी कुंजी पूछें:
$ echo "${userdata[name]}"
seth
$ echo "${userdata[login]}"
1583362192
किसी सरणी से आपके द्वारा अपेक्षित अधिकांश सामान्य सरणी संचालन उपलब्ध हैं।
बैश कैसे ढेर होता है
साहचर्य सरणियों के लिए पूर्ण समर्थन प्रदान करने के लिए बैश एकमात्र शेल है (फिर से, Zsh करीब आता है लेकिन कुंजियों को सूचीबद्ध करने के लिए कार्यों की कमी है)।
शेल स्क्रिप्टिंग के लिए बैश चुनें
बैश में कुछ सुविधाएं POSIX- अनुरूप नहीं हैं। सिद्धांत रूप में, इसका मतलब है कि आप एक बैश स्क्रिप्ट लिख सकते हैं जो बैश के बिना सिस्टम पर अपेक्षित रूप से नहीं चलती है। अगर ऐसा होता है, तो कहा जाता है कि आपकी स्क्रिप्ट "पोर्टेबल" नहीं है।
व्यवहार में, हालांकि, बैश मुक्त और खुला स्रोत सॉफ्टवेयर है, इसलिए कोई भी इसे स्थापित कर सकता है, चाहे वे लिनक्स, बीएसडी, ओपनइंडियाना, विंडोज या मैकओएस चलाते हों। बैश को स्थापित करने के लिए उपयोगकर्ता को बैश को अपने डिफ़ॉल्ट शेल के रूप में उपयोग करने की आवश्यकता नहीं है, या यहां तक कि इसे जानबूझकर लॉन्च करने की भी आवश्यकता नहीं है, क्योंकि एक अच्छी शेल स्क्रिप्ट यह पहचानती है कि वह अपने शीर्ष shebang में किस शेल का उपयोग करता है। लाइन (#!/bin/bash , उदाहरण के लिए)।
जब संदेह हो, तो अपने दस्तावेज़ में बैश को अपनी शेल स्क्रिप्ट की निर्भरता के रूप में शामिल करें (भले ही यह एकमात्र निर्भरता हो) उपयोगकर्ताओं को सचेत करने के लिए कि यह एक बैश स्क्रिप्ट है और सामान्य शेल स्क्रिप्ट नहीं है।
बैश में कई उपयुक्तताएं हैं, और मुझे लगता है कि उपयोगकर्ता ने बैश स्थापित किया है या नहीं, इस पर अधिक चिंताएं हैं। जैसे कि पायथन या जावा या किसी अन्य सॉफ़्टवेयर के साथ, कभी-कभी निर्भरताएँ होती हैं। यदि आप बैश का आनंद लेते हैं और इसके शॉर्टहैंड और शॉर्टकट उपयोगी पाते हैं, तो अपने आप को छोटा न करें।