हाल ही में मैं एक शेल स्क्रिप्ट पर काम कर रहा था और मैंने एक महत्वपूर्ण अंतर देखा कि कैसे विशेष चर $
. को बैश किया जाता है और BASHPID
व्यवहार करता है। Linux में चलने वाली प्रत्येक प्रक्रिया को एक प्रक्रिया ID . के साथ असाइन किया जाएगा और इसी तरह से ऑपरेटिंग सिस्टम प्रक्रिया को संभालता है।
इसी तरह, आपका बैश टर्मिनल सत्र भी एक प्रक्रिया आईडी के साथ सौंपा जाएगा। "$"
. नामक एक विशेष चर है और "$BASHPID"
जो मौजूदा शेल की प्रोसेस आईडी को स्टोर करता है।
आगे बढ़ें और नीचे दिए गए कमांड को चलाकर देखें कि आपके वर्तमान शेल की प्रक्रिया आईडी क्या है। दोनों "$"
और "$BASHPID"
वही मान लौटाने जा रहा है।
$ echo $$ # Printing special variable $ $ echo $BASHPID # Printing the varibale $BASHPID
बैश में जब हम शेल से किसी बाहरी प्रोग्राम को कॉल करते हैं, तो यह एक चाइल्ड प्रोसेस/सबशेल बनाएगा और प्रोग्राम को चाइल्ड प्रोसेस में ही सबमिट किया जाएगा। नीचे दिए गए उदाहरण को देखें जहां मैंने “sample.sh” . नामक एक स्क्रिप्ट में एक साधारण प्रोसेस मॉनिटर कमांड को रखा है यह प्रदर्शित करने के लिए कि पैरेंट शेल प्रोग्राम को चलाने के लिए एक सबशेल कैसे बनाता है।
#!/usr/bin/env bash ps -ef --forest | grep -i 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
ठीक है, यह वही प्रक्रिया आईडी देता है। यहाँ वास्तविक अंतर आता है। आइए parentheses()
. के अंदर कमांड चलाकर स्क्रिप्ट के अंदर एक और चाइल्ड प्रोसेस बनाएं ।
# STORING THE PID INTO A VARIABLE… VAR_HASH=$(echo $$) VAR_BASHPID=$(echo $BASHPID) echo "VALUE OF VAR_HASH ==> $VAR_HASH" echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"
बैश में, कोष्ठक एक बच्चे की प्रक्रिया का आह्वान करेगा और जो कुछ भी कोष्ठक के अंदर आता है उसे चलाएगा। उस स्थिति में, दोनों $
और $BASHPID
एक नया चाइल्ड प्रोसेस आईडी स्टोर करना चाहिए। लेकिन ऊपर की छवि से, आप देख सकते हैं कि $
. में एक अंतर है स्टोर करता है 382 जो मूल आईडी है (स्क्रिप्ट की प्रक्रिया आईडी sample.sh ), और $BASHPID
कोष्ठक द्वारा बनाई गई चाइल्ड प्रोसेस आईडी को स्टोर करता है।
आइए अब इस व्यवहार को समझने की कोशिश करते हैं। हम देखेंगे कि मैन पेज क्या कहता है।
$ man bash
जब आप $
. का उपयोग करते हैं , यहां तक कि एक सबहेल में, यह उस मूल प्रक्रिया की प्रक्रिया आईडी को संग्रहीत करता है जिससे इसे बनाया गया था। लेकिन BASHPID
वर्तमान प्रक्रिया आईडी को संग्रहीत करेगा, अर्थात जब कोष्ठक के अंदर कहा जाता है तो यह चाइल्ड प्रोसेस आईडी को संग्रहीत करेगा।
हम वैरिएबल $
. को असाइन या संशोधित नहीं कर सकते हैं , लेकिन BASHPID
पुन:असाइन किया जा सकता है लेकिन इसका कोई प्रभाव नहीं पड़ता है।
$ $=10 $ BASHPID=10 $ echo $BASHPID
BASHPID . को अनसेट करना संभव है . जब आप सेट नहीं करते हैं तो यह अपनी विशेष स्थिति खो देता है और साथ ही आप इसे सामान्य चर के रूप में उपयोग करना शुरू कर सकते हैं।
$ unset BASHPID $ echo $BASHPID $ BASHPID="Tecmint" $ echo $BASHPID
यहां तक कि अगर आप शेल की प्रक्रिया आईडी निर्दिष्ट करने का प्रयास करते हैं तो इसे उपयोगकर्ता द्वारा परिभाषित चर के रूप में माना जाएगा क्योंकि यह पहले से ही अपनी विशेष स्थिति खो चुका है।
$ BASHPID=$(echo $$) $ echo $$;echo $BASHPID
इस मामले में, आपको BASHPID . के लिए एक नए टर्मिनल सत्र का उपयोग करना होगा अपनी विशेष अवस्था प्राप्त करने के लिए।
इस लेख के लिए बस इतना ही। हमने $
. के बीच अंतर देखा है और BASHPID
और वे इस लेख में कैसे व्यवहार करते हैं। इस लेख को पढ़ें और अपनी बहुमूल्य प्रतिक्रिया हमारे साथ साझा करें।