Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Bash प्रोग्रामिंग

Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया

इस लेख का मुख्य फोकस यह स्पष्ट रूप से समझना है कि जब आप 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
Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया

अब देखते हैं कि जब आप shebang के बिना अपना प्रोग्राम सबमिट करने का प्रयास करते हैं तो क्या होता है। shebang की अनुपस्थिति में, प्रोग्राम को वर्तमान शेल पर सबमिट किया जाएगा जिसे आप चला रहे हैं, मेरे मामले में, यह Bash (/bin/bash) है।

मैं एक उदाहरण प्रदर्शित करूंगा। मैं shebang के बिना एक पायथन स्क्रिप्ट बना रहा हूँ और जब मैं प्रोग्राम को कॉल करता हूँ, तो bash नहीं जानता कि इसे पायथन इंटरप्रेटर पर सबमिट करना चाहिए, इसके बजाय यह प्रोग्राम को वर्तमान शेल में चलाएगा।

$ cat > run-py.py
echo $SHELL
print("Hello world")
$ chmod +x run-py.py
$ ./run-py.py
Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया

इस मामले में, आप प्रोग्राम को उस इंटरप्रेटर का उल्लेख करके कॉल कर सकते हैं जिस पर इसे सबमिट किया जाना चाहिए या बस shebang लाइन जोड़ें जो हमेशा अनुशंसित है।

# which python3
$(which python3) /home/karthick/run_py.py
Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया

अब जब आप जानते हैं कि स्क्रिप्ट को कैसे कॉल करना है, तो अगला कदम यह समझना होगा कि जब हम स्क्रिप्ट को कॉल करते हैं तो क्या होता है। जब आप उपरोक्त उदाहरणों में दिखाए अनुसार स्क्रिप्ट को इनवोक करते हैं तो यह एक चाइल्ड प्रोसेस (forking) बनाएगा और स्क्रिप्ट को चाइल्ड प्रोसेस में सबमिट किया जाएगा। मैंने एक नमूना स्क्रिप्ट चलाई जो केवल निम्न कमांड चलाएगी और दिखाएगी कि स्क्रिप्ट को चाइल्ड प्रोसेस में सबमिट किया जाता है।

$ ps -ef --forest | grep -i bash
Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया

स्क्रिप्ट के हिस्से के रूप में कई चाइल्ड प्रोसेस हो सकते हैं और यह हमारे कोड पर निर्भर करता है। यह ध्यान रखना है कि सबस्क्रिप्ट द्वारा बनाए गए एनवायरनमेंट वेरिएबल्स एक बार समाप्त होने पर समाप्त हो जाएंगे। एक चाइल्ड प्रोसेस पैरेंट प्रोसेस द्वारा बनाए गए वेरिएबल्स को एक्सपोर्ट करके एक्सेस कर सकता है। लेकिन पैरेंट प्रोसेस चाइल्ड प्रोसेस द्वारा बनाए गए वेरिएबल्स को एक्सेस नहीं कर सकता।

वेरिएबल्स कैसे काम करते हैं और वेरिएबल्स को कैसे एक्सपोर्ट करना है, इसे समझने के लिए नीचे दिए गए लेख देखें।

  • शेल स्क्रिप्टिंग में 'लिनक्स वेरिएबल्स' को समझना और लिखना
  • Bash में $$ और $BASHPID के बीच अंतर जानें

स्क्रिप्ट को Source करना

"Source" एक शेल बिल्ट-इन कमांड है जो इसे पास की गई फ़ाइल को पढ़ता है और कोड को वर्तमान शेल वातावरण में चलाता है। एक उपयुक्त उपयोग केस जिसका आप ज्यादातर उपयोग करते हैं, वह है .bashrc या .bash_profile में अपने कॉन्फ़िगरेशन को संशोधित करना और source कमांड का उपयोग करके परिवर्तनों को रीलोड करना।

$ type -a source
Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया 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
Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया

स्क्रिप्ट के लिए एक्जीक्यूशन परमिशन सेट करें और मेन स्क्रिप्ट "main.sh" को कॉल करें। अब, यह स्क्रिप्ट वर्तमान शेल वातावरण में फ़ंक्शन f1 और वेरिएबल VAR1 को खोजने का प्रयास करेगी और कमांड नॉट फाउंड के साथ विफल हो जाएगी।

$ bash main.sh
Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया

अब आइए स्क्रिप्ट के अंदर 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 समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया

अब स्क्रिप्ट को फिर से चलाएं और देखें।

$ bash main.sh
Bash समझें: Sourcing बनाम Forking - मुख्य अंतर समझाया गया

Source bash में मॉड्यूलर प्रोग्रामिंग दृष्टिकोण का पालन करने के लिए हमारे शेल स्क्रिप्ट बनाने में बहुत उपयोगी है। हम अपने कोड को छोटे मॉड्यूल में तोड़ सकते हैं और कई प्रोग्राम में उपयोग कर सकते हैं। इन तरीकों से, हम DRY (Don't Repeat Yourself) सिद्धांत का पालन कर सकते हैं।

इस लेख के लिए बस इतना ही। हमने bash में sourcing और forking के बीच अंतर पर संक्षेप में चर्चा की है। लेख को पढ़ें और हमारे साथ अपनी बहुमूल्य प्रतिक्रिया साझा करें।

  1. - C और C++ में अंतर

    जैसा कि हम जानते हैं C और C++ दोनों प्रोग्रामिंग भाषाएं हैं और एप्लिकेशन विकास के लिए उपयोग की जाती हैं। इन दोनों भाषाओं के बीच मुख्य अंतर यह है कि C एक प्रक्रियात्मक प्रोग्रामिंग भाषा है और क्लासेस और ऑब्जेक्ट्स का समर्थन नहीं करती, जबकि C++ प्रक्रियात्मक और ऑब्जेक्ट-ओरिएंटेड दोनों प्रोग्रामिंग भा

  1. - Go और Java में अंतर

    GoGo एक प्रक्रियात्मक प्रोग्रामिंग भाषा है। प्रोग्राम पैकेज का उपयोग करके असेंबल किए जाते हैं। यह डायनामिक भाषाओं के समान पैटर्न को अपनाने वाले वातावरण का समर्थन करता है।JavaJava एक ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषा है। Java काफी तेज, विश्वसनीय और सुरक्षित है। यह सबसे व्यापक रूप से उपयोग की जाने व

  1. Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या

    हाल ही में मैं एक शेल स्क्रिप्ट पर काम कर रहा था और मैंने देखा कि bash स्पेशल वेरिएबल $$ और $BASHPID कैसे व्यवहार करते हैं, इसमें एक महत्वपूर्ण अंतर है। लिनक्स में चलने वाली हर प्रोसेस को एक प्रोसेस ID असाइन किया जाता है और इस तरह ऑपरेटिंग सिस्टम प्रोसेस को संभालता है। संबंधित पढ़ें: Bash में Sourc