इस लेख का मुख्य फोकस स्पष्ट रूप से यह समझना है कि जब आप स्क्रिप्ट बनाम स्रोत चलाते हैं तो क्या होता है बैश में स्क्रिप्ट। सबसे पहले, हम स्पष्ट रूप से समझेंगे कि जब आप स्क्रिप्ट को अलग-अलग तरीकों से कॉल करते हैं तो प्रोग्राम कैसे सबमिट किया जाता है।
नोट :एक्सटेंशन के साथ स्क्रिप्ट बनाना कोई मायने नहीं रखता। बिना एक्सटेंशन के भी स्क्रिप्ट ठीक चलेगी।
मूल रूप से, प्रत्येक स्क्रिप्ट एक लाइन से शुरू होती है जिसे शेबंग(#!) . कहा जाता है . हैश बैश में प्रतीक की व्याख्या टिप्पणियों के रूप में की जाएगी लेकिन शेबैंग विशेष अर्थ रखता है। यह बैश को शेबांग . में आपके द्वारा उल्लिखित किसी भी दुभाषिया में प्रोग्राम सबमिट करने के लिए कहता है ।
नीचे एक नमूना कार्यक्रम है और मैं अपने दुभाषिया के रूप में बैश निर्दिष्ट कर रहा हूं।
$ cat >> Hello_World.sh #!/usr/bin/env bash echo "Hello world" $ chmod +x Hello_world.sh
अब स्क्रिप्ट चलाने के लिए, आप इसे दो तरह से कर सकते हैं।
- स्क्रिप्ट को कॉल करने के लिए एक सापेक्ष पथ का उपयोग करें। उस निर्देशिका में जाएँ जहाँ स्क्रिप्ट मौजूद है और ./Hello_world.sh run चलाएं ।
- स्क्रिप्ट को कॉल करने के लिए पूर्ण पथ का उपयोग करें। फ़ाइल सिस्टम में कहीं से भी स्क्रिप्ट का पूरा पथ टाइप करें।
$ ./Hello_world.sh $ pwd $ /home/karthick/Hello_world
अब देखते हैं कि जब आप शेबैंग . के बिना अपना प्रोग्राम सबमिट करने का प्रयास करते हैं तो क्या होता है . शेबांग . की अनुपस्थिति में , आप जिस भी मौजूदा शेल के साथ चल रहे हैं, प्रोग्राम को सबमिट किया जाएगा, मेरे मामले में, यह बैश है (/bin/bash )।
मैं एक उदाहरण प्रदर्शित करता हूं। मैं शेबैंग . के बिना एक अजगर स्क्रिप्ट बना रहा हूं और जब मैं प्रोग्राम को कॉल करता हूं, बैश यह नहीं जानता कि इसे इस प्रोग्राम को पायथन इंटरप्रेटर को सबमिट करना चाहिए, इसके बजाय यह प्रोग्राम को वर्तमान शेल में चलाएगा।
$ cat > run-py.py echo $SHELL print("Hello world") $ chmod +x run-py.py $ ./run-py.py
इस मामले में, आप प्रोग्राम को यह उल्लेख करके कॉल कर सकते हैं कि इसे किस दुभाषिया पर सबमिट किया जाना चाहिए या केवल शेबैंग जोड़ें लाइन जिसकी हमेशा अनुशंसा की जाती है।
# which python3 $(which python3) /home/karthick/run_py.py
अब जब आप जानते हैं कि स्क्रिप्ट को कैसे कॉल किया जाता है, तो अगला कदम यह समझना होगा कि जब हम स्क्रिप्ट को कॉल करते हैं तो क्या होता है। जब आप उपरोक्त उदाहरणों में दिखाए गए अनुसार स्क्रिप्ट का आह्वान करते हैं तो यह एक चाइल्ड प्रोसेस (forking .) बनाएगी ) और स्क्रिप्ट को चाइल्ड प्रोसेस में सबमिट कर दिया जाएगा। मैंने एक नमूना स्क्रिप्ट चलाई जो केवल निम्न आदेश चलाएगी और दिखाती है कि स्क्रिप्ट एक बच्चे की प्रक्रिया में सबमिट की गई है।
$ ps -ef --forest | grep -i bash
स्क्रिप्ट के एक भाग के रूप में कई चाइल्ड प्रोसेस हो सकते हैं और यह हमारे कोड पर निर्भर करता है। यह ध्यान दिया जाना चाहिए कि सबस्क्रिप्ट द्वारा बनाए गए पर्यावरण चर समाप्त होने के बाद छोड़ दिए जाएंगे। चाइल्ड प्रोसेस पैरेंट प्रोसेस द्वारा बनाए गए वेरिएबल को एक्सपोर्ट करके एक्सेस कर सकता है। लेकिन पैरेंट प्रोसेस चाइल्ड प्रोसेस द्वारा बनाए गए वेरिएबल्स को एक्सेस नहीं कर सकता है।
वेरिएबल कैसे काम करते हैं और वेरिएबल कैसे एक्सपोर्ट करते हैं, इस बारे में अधिक समझने के लिए नीचे दिए गए लेखों पर एक नज़र डालें।
- शैल स्क्रिप्टिंग में 'लिनक्स वैरिएबल' को समझना और लिखना
- बैश में $$ और $BASHPID के बीच अंतर जानें
स्क्रिप्ट की सोर्सिंग
“स्रोत "एक शेल बिल्ट-इन कमांड है जो पास की गई फाइल को एक तर्क के रूप में पढ़ता है और वर्तमान शेल वातावरण में कोड चलाता है। एक उपयुक्त उपयोग मामला जिसका आप अधिकतर उपयोग करते हैं वह है .bashrc
. में अपने कॉन्फ़िगरेशन को संशोधित करना या .bash_profile
और स्रोत आदेश . का उपयोग करके परिवर्तनों को पुनः लोड करना ।
$ type -a source
स्रोत आदेश . को चलाने के दो वाक्यात्मक तरीके हैं . आप दो सिंटैक्स में से किसी को भी चुन सकते हैं और यह व्यक्तिगत पसंद का है।
$ source FILE_NAME [ARGUMENTS] $ . FILE_NAME [ARGUMENTS]
मुझे यह दिखाने दें कि स्रोत वास्तव में कैसे काम करता है। मैं दो शेल स्क्रिप्ट बनाने जा रहा हूं। पहली स्क्रिप्ट (Module.sh ) कुछ चर और कार्यों को रखने जा रहा है। दूसरी स्क्रिप्ट (Main.sh ) वेरिएबल को प्रिंट करने और फंक्शन को कॉल करने जा रहा है।
फ़ाइल Module.sh ।
#!/usr/bin/env bash VAR1=$(echo "Welcome to $1") function f1(){ echo “Function f1 is called” }
फ़ाइल Main.sh ।
#!/usr/bin/env bash echo $VAR1 f1
स्क्रिप्ट के लिए निष्पादन अनुमति सेट करें और मुख्य स्क्रिप्ट को कॉल करें “main.sh” . अब, यह स्क्रिप्ट फ़ंक्शन f1
. को खोजने का प्रयास करेगी और चर VAR1
वर्तमान शेल वातावरण में और कमांड नहीं मिलने से विफल हो जाएगा।
$ bash main.sh
अब स्क्रिप्ट के अंदर स्रोत कमांड चलाते हैं जो चर और कार्यों को वर्तमान शेल वातावरण में लोड करेगा और जो कि “main.sh” द्वारा सुलभ होगा। ।
फ़ाइल Module.sh ।
#!/usr/bin/env bash VAR1=$(echo "Welcome to $1") function f1(){ echo “Function f1 is called” }
फ़ाइल Main.sh ।
#!/usr/bin/env bash source module.sh Tecmint echo $VAR1 f1
अब स्क्रिप्ट को फिर से चलाएँ और देखें।
$ bash main.sh
स्रोत बैश . में बहुत उपयोगी है हमारी शेल स्क्रिप्ट बनाने में मॉड्यूलर प्रोग्रामिंग दृष्टिकोण का पालन करने के लिए। हम अपने कोड को छोटे मॉड्यूल में तोड़ सकते हैं और कई कार्यक्रमों में इस्तेमाल किया जा सकता है। इन तरीकों से, हम DRY . का अनुसरण कर सकते हैं (खुद को न दोहराएं ) सिद्धांत।
इस लेख के लिए बस इतना ही। हमने बैश में सोर्सिंग और फोर्किंग के बीच के अंतर पर संक्षेप में चर्चा की है। लेख को पढ़ें और अपनी बहुमूल्य प्रतिक्रिया हमारे साथ साझा करें।