इस लेख का मुख्य फोकस यह स्पष्ट रूप से समझना है कि जब आप bash में स्क्रिप्ट चलाते हैं बनाम source करते हैं तो क्या होता है। पहले, हम स्पष्ट रूप से समझेंगे कि प्रोग्राम कैसे सबमिट होता है जब आप स्क्रिप्ट को अलग-अलग तरीकों से कॉल करते हैं।
नोट: एक्सटेंशन के साथ स्क्रिप्ट बनाने से कोई फर्क नहीं पड़ता। स्क्रिप्ट एक्सटेंशन के बिना भी ठीक चलेगी।
मूल रूप से, हर स्क्रिप्ट shebang (#!) नामक एक लाइन से शुरू होती है। Bash में हैश सिंबल को कमेंट्स के रूप में इंटरप्रेट किया जाएगा लेकिन shebang का एक विशेष अर्थ है। यह bash को बताता है कि प्रोग्राम को आपके द्वारा shebang में उल्लिखित इंटरप्रेटर में सबमिट करें।
नीचे एक नमूना प्रोग्राम है और मैं bash को अपने इंटरप्रेटर के रूप में निर्दिष्ट कर रहा हूँ।
$ cat >> Hello_World.sh #!/usr/bin/env bash echo "Hello world" $ chmod +x Hello_world.sh
अब स्क्रिप्ट चलाने के लिए, आप इसे दो तरीकों से कर सकते हैं।
- स्क्रिप्ट को कॉल करने के लिए रिलेटिव पथ का उपयोग करें। उस डायरेक्टरी में जाएं जहां स्क्रिप्ट मौजूद है और ./Hello_world.sh चलाएं।
- स्क्रिप्ट को कॉल करने के लिए एब्सोल्यूट पथ का उपयोग करें। फाइल सिस्टम में कहीं से भी स्क्रिप्ट का पूरा पथ टाइप करें।
$ ./Hello_world.sh $ pwd $ /home/karthick/Hello_world
अब देखते हैं कि जब आप shebang के बिना अपना प्रोग्राम सबमिट करने का प्रयास करते हैं तो क्या होता है। shebang की अनुपस्थिति में, प्रोग्राम को वर्तमान शेल पर सबमिट किया जाएगा जिसे आप चला रहे हैं, मेरे मामले में, यह Bash (/bin/bash) है।
मैं एक उदाहरण प्रदर्शित करूंगा। मैं shebang के बिना एक पायथन स्क्रिप्ट बना रहा हूँ और जब मैं प्रोग्राम को कॉल करता हूँ, तो bash नहीं जानता कि इसे पायथन इंटरप्रेटर पर सबमिट करना चाहिए, इसके बजाय यह प्रोग्राम को वर्तमान शेल में चलाएगा।
$ cat > run-py.py
echo $SHELL
print("Hello world")
$ chmod +x run-py.py
$ ./run-py.py
इस मामले में, आप प्रोग्राम को उस इंटरप्रेटर का उल्लेख करके कॉल कर सकते हैं जिस पर इसे सबमिट किया जाना चाहिए या बस shebang लाइन जोड़ें जो हमेशा अनुशंसित है।
# which python3 $(which python3) /home/karthick/run_py.py
अब जब आप जानते हैं कि स्क्रिप्ट को कैसे कॉल करना है, तो अगला कदम यह समझना होगा कि जब हम स्क्रिप्ट को कॉल करते हैं तो क्या होता है। जब आप उपरोक्त उदाहरणों में दिखाए अनुसार स्क्रिप्ट को इनवोक करते हैं तो यह एक चाइल्ड प्रोसेस (forking) बनाएगा और स्क्रिप्ट को चाइल्ड प्रोसेस में सबमिट किया जाएगा। मैंने एक नमूना स्क्रिप्ट चलाई जो केवल निम्न कमांड चलाएगी और दिखाएगी कि स्क्रिप्ट को चाइल्ड प्रोसेस में सबमिट किया जाता है।
$ ps -ef --forest | grep -i bash
स्क्रिप्ट के हिस्से के रूप में कई चाइल्ड प्रोसेस हो सकते हैं और यह हमारे कोड पर निर्भर करता है। यह ध्यान रखना है कि सबस्क्रिप्ट द्वारा बनाए गए एनवायरनमेंट वेरिएबल्स एक बार समाप्त होने पर समाप्त हो जाएंगे। एक चाइल्ड प्रोसेस पैरेंट प्रोसेस द्वारा बनाए गए वेरिएबल्स को एक्सपोर्ट करके एक्सेस कर सकता है। लेकिन पैरेंट प्रोसेस चाइल्ड प्रोसेस द्वारा बनाए गए वेरिएबल्स को एक्सेस नहीं कर सकता।
वेरिएबल्स कैसे काम करते हैं और वेरिएबल्स को कैसे एक्सपोर्ट करना है, इसे समझने के लिए नीचे दिए गए लेख देखें।
- शेल स्क्रिप्टिंग में 'लिनक्स वेरिएबल्स' को समझना और लिखना
- Bash में $$ और $BASHPID के बीच अंतर जानें
स्क्रिप्ट को Source करना
"Source" एक शेल बिल्ट-इन कमांड है जो इसे पास की गई फ़ाइल को पढ़ता है और कोड को वर्तमान शेल वातावरण में चलाता है। एक उपयुक्त उपयोग केस जिसका आप ज्यादातर उपयोग करते हैं, वह है .bashrc या .bash_profile में अपने कॉन्फ़िगरेशन को संशोधित करना और source कमांड का उपयोग करके परिवर्तनों को रीलोड करना।
$ type -a source
source कमांड को चलाने के दो सिंटैक्टिक तरीके हैं। आप दो सिंटैक्स में से किसी को भी चुन सकते हैं और यह व्यक्तिगत पसंद की बात है।
$ source FILE_NAME [ARGUMENTS] $ . FILE_NAME [ARGUMENTS]
मैं प्रदर्शित करूंगा कि source वास्तव में कैसे काम करता है। मैं दो शेल स्क्रिप्ट बनाने जा रहा हूँ। पहली स्क्रिप्ट (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
अब आइए स्क्रिप्ट के अंदर source कमांड चलाएं जो वेरिएबल और फ़ंक्शंस को वर्तमान शेल वातावरण में लोड करेगा और जो "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
Source bash में मॉड्यूलर प्रोग्रामिंग दृष्टिकोण का पालन करने के लिए हमारे शेल स्क्रिप्ट बनाने में बहुत उपयोगी है। हम अपने कोड को छोटे मॉड्यूल में तोड़ सकते हैं और कई प्रोग्राम में उपयोग कर सकते हैं। इन तरीकों से, हम DRY (Don't Repeat Yourself) सिद्धांत का पालन कर सकते हैं।
इस लेख के लिए बस इतना ही। हमने bash में sourcing और forking के बीच अंतर पर संक्षेप में चर्चा की है। लेख को पढ़ें और हमारे साथ अपनी बहुमूल्य प्रतिक्रिया साझा करें।