हाल ही में मैं एक शेल स्क्रिप्ट पर काम कर रहा था और मैंने देखा कि bash स्पेशल वेरिएबल $$ और $BASHPID कैसे व्यवहार करते हैं, इसमें एक महत्वपूर्ण अंतर है। लिनक्स में चलने वाली हर प्रोसेस को एक प्रोसेस ID असाइन किया जाता है और इस तरह ऑपरेटिंग सिस्टम प्रोसेस को संभालता है।
संबंधित पढ़ें: Bash में Sourcing और Forking के बीच अंतर जानें
इसी तरह, आपके bash टर्मिनल सेशन को भी एक प्रोसेस ID असाइन किया जाएगा। एक स्पेशल वेरिएबल है जिसे $$ और $BASHPID कहा जाता है जो वर्तमान शेल की प्रोसेस ID को स्टोर करता है।
आगे बढ़ें और नीचे दी गई कमांड चलाएं ताकि आप देख सकें कि आपके वर्तमान शेल की प्रोसेस ID क्या है। दोनों $$ और $BASHPID समान मान लौटाने जा रहे हैं।
$ echo $$ # स्पेशल वेरिएबल $$ प्रिंट कर रहा है $ echo $BASHPID # वेरिएबल $BASHPID प्रिंट कर रहा है
Bash में जब हम शेल से किसी एक्सटर्नल प्रोग्राम को कॉल करते हैं, तो यह एक चाइल्ड प्रोसेस/सबशेल बनाता है और प्रोग्राम को केवल चाइल्ड प्रोसेस में सबमिट किया जाता है। नीचे उदाहरण देखें जहां मैं sample.sh नामक स्क्रिप्ट में एक साधारण प्रोसेस मॉनिटर कमांड डालता हूँ ताकि यह प्रदर्शित कर सकूं कि पैरेंट शेल प्रोग्राम चलाने के लिए सबशेल कैसे बनाता है।
#!/usr/bin/env bash ps -ef --forest | grep -i bash
अब इस स्क्रिप्ट को चलाने पर हम bash की प्रोसेस ID प्राप्त कर सकते हैं। नीचे दी गई छवि से, आप समझ सकते हैं कि जब मैंने स्क्रिप्ट को कॉल किया तो bash एक चाइल्ड प्रोसेस बनाता है और स्क्रिप्ट चलाता है।
$ ./sample.sh
अब आइए स्क्रिप्ट के अंदर दोनों $$ और $BASHPID का उपयोग करें और देखें कि यह क्या लौटाता है।
#!/usr/bin/env bash echo "============================" ps -ef --forest | grep -i bash echo "============================" echo "PID USING $$ FOR SCRIPT $0 ==> $$" echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID" echo
अब स्क्रिप्ट को फिर से चलाएं।
$ ./sample.sh
ठीक है, यह समान प्रोसेस ID लौटाता है। यहां वास्तविक अंतर आता है। आइए स्क्रिप्ट के अंदर पैरेंथेसिस () में एक कमांड चलाकर एक और चाइल्ड प्रोसेस बनाएं।
# वेरिएबल में PID स्टोर करना... VAR_HASH=$(echo $$) VAR_BASHPID=$(echo $BASHPID) echo "VALUE OF VAR_HASH ==> $VAR_HASH" echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"
Bash में, पैरेंथेसिस एक चाइल्ड प्रोसेस को इनवोक करेगा और पैरेंथेसिस के अंदर जो कुछ भी आता है उसे चलाएगा। उस मामले में, दोनों $$ और $BASHPID को एक नई चाइल्ड प्रोसेस ID स्टोर करनी चाहिए। लेकिन उपरोक्त छवि से, आप देख सकते हैं कि वहां अंतर है जहां $$ 382 स्टोर करता है जो पैरेंट ID है (स्क्रिप्ट sample.sh की प्रोसेस ID), और $BASHPID पैरेंथेसिस द्वारा बनाई गई चाइल्ड प्रोसेस ID को स्टोर करता है।
अब आइए इस व्यवहार को समझने की कोशिश करें। हम देखेंगे कि मैन पेज क्या कहता है।
$ man bash
जब आप $$ का उपयोग करते हैं, तो सबशेल में भी, यह उस पैरेंट प्रोसेस की प्रोसेस ID स्टोर करता है जिससे यह बनाया गया था। लेकिन BASHPID वर्तमान प्रोसेस ID स्टोर करेगा, यानी जब पैरेंथेसिस के अंदर कॉल किया जाता है तो यह चाइल्ड प्रोसेस ID स्टोर करेगा।
हम वेरिएबल $$ को असाइन या मॉडिफाई नहीं कर सकते, लेकिन BASHPID को रीअसाइन किया जा सकता है लेकिन इसका कोई प्रभाव नहीं होता।
$ $$=10 $ BASHPID=10 $ echo $BASHPID
BASHPID को अनसेट करना संभव है। जब आप इसे अनसेट करते हैं तो यह अपनी स्पेशल स्टेट खो देता है और आप इसे सामान्य वेरिएबल के रूप में उपयोग करना शुरू कर सकते हैं।
$ unset BASHPID $ echo $BASHPID $ BASHPID="Tecmint" $ echo $BASHPID
यहां तक कि यदि आप शेल की प्रोसेस ID असाइन करने का प्रयास करते हैं तो इसे उपयोगकर्ता-परिभाषित वेरिएबल के रूप में माना जाएगा क्योंकि यह पहले ही अपनी स्पेशल स्टेट खो चुका है।
$ BASHPID=$(echo $$) $ echo $$;echo $BASHPID
इस मामले में, BASHPID को अपनी स्पेशल स्टेट प्राप्त करने के लिए एक नए टर्मिनल सेशन का उपयोग करना होगा।
इस लेख के लिए बस इतना ही। हमने इस लेख में $$ और BASHPID के बीच अंतर और वे कैसे व्यवहार करते हैं, देखा है। इस लेख को पढ़ें और हमारे साथ अपनी बहुमूल्य प्रतिक्रिया साझा करें।