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

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

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

संबंधित पढ़ें: Bash में Sourcing और Forking के बीच अंतर जानें

इसी तरह, आपके bash टर्मिनल सेशन को भी एक प्रोसेस ID असाइन किया जाएगा। एक स्पेशल वेरिएबल है जिसे $$ और $BASHPID कहा जाता है जो वर्तमान शेल की प्रोसेस ID को स्टोर करता है।

आगे बढ़ें और नीचे दी गई कमांड चलाएं ताकि आप देख सकें कि आपके वर्तमान शेल की प्रोसेस ID क्या है। दोनों $$ और $BASHPID समान मान लौटाने जा रहे हैं।

$ echo $$ # स्पेशल वेरिएबल $$ प्रिंट कर रहा है
$ echo $BASHPID # वेरिएबल $BASHPID प्रिंट कर रहा है
Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या

Bash में जब हम शेल से किसी एक्सटर्नल प्रोग्राम को कॉल करते हैं, तो यह एक चाइल्ड प्रोसेस/सबशेल बनाता है और प्रोग्राम को केवल चाइल्ड प्रोसेस में सबमिट किया जाता है। नीचे उदाहरण देखें जहां मैं sample.sh नामक स्क्रिप्ट में एक साधारण प्रोसेस मॉनिटर कमांड डालता हूँ ताकि यह प्रदर्शित कर सकूं कि पैरेंट शेल प्रोग्राम चलाने के लिए सबशेल कैसे बनाता है।

#!/usr/bin/env bash
ps -ef --forest | grep -i bash

अब इस स्क्रिप्ट को चलाने पर हम bash की प्रोसेस ID प्राप्त कर सकते हैं। नीचे दी गई छवि से, आप समझ सकते हैं कि जब मैंने स्क्रिप्ट को कॉल किया तो bash एक चाइल्ड प्रोसेस बनाता है और स्क्रिप्ट चलाता है।

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

अब आइए स्क्रिप्ट के अंदर दोनों $$ और $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
Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या

ठीक है, यह समान प्रोसेस 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 वेरिएबल्स की व्याख्या Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या

Bash में, पैरेंथेसिस एक चाइल्ड प्रोसेस को इनवोक करेगा और पैरेंथेसिस के अंदर जो कुछ भी आता है उसे चलाएगा। उस मामले में, दोनों $$ और $BASHPID को एक नई चाइल्ड प्रोसेस ID स्टोर करनी चाहिए। लेकिन उपरोक्त छवि से, आप देख सकते हैं कि वहां अंतर है जहां $$ 382 स्टोर करता है जो पैरेंट ID है (स्क्रिप्ट sample.sh की प्रोसेस ID), और $BASHPID पैरेंथेसिस द्वारा बनाई गई चाइल्ड प्रोसेस ID को स्टोर करता है।

अब आइए इस व्यवहार को समझने की कोशिश करें। हम देखेंगे कि मैन पेज क्या कहता है।

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

जब आप $$ का उपयोग करते हैं, तो सबशेल में भी, यह उस पैरेंट प्रोसेस की प्रोसेस ID स्टोर करता है जिससे यह बनाया गया था। लेकिन BASHPID वर्तमान प्रोसेस ID स्टोर करेगा, यानी जब पैरेंथेसिस के अंदर कॉल किया जाता है तो यह चाइल्ड प्रोसेस ID स्टोर करेगा।

हम वेरिएबल $$ को असाइन या मॉडिफाई नहीं कर सकते, लेकिन BASHPID को रीअसाइन किया जा सकता है लेकिन इसका कोई प्रभाव नहीं होता।

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

BASHPID को अनसेट करना संभव है। जब आप इसे अनसेट करते हैं तो यह अपनी स्पेशल स्टेट खो देता है और आप इसे सामान्य वेरिएबल के रूप में उपयोग करना शुरू कर सकते हैं।

$ unset BASHPID
$ echo $BASHPID
$ BASHPID="Tecmint"
$ echo $BASHPID
Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या

यहां तक कि यदि आप शेल की प्रोसेस ID असाइन करने का प्रयास करते हैं तो इसे उपयोगकर्ता-परिभाषित वेरिएबल के रूप में माना जाएगा क्योंकि यह पहले ही अपनी स्पेशल स्टेट खो चुका है।

$ BASHPID=$(echo $$)
$ echo $$;echo $BASHPID
Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या

इस मामले में, BASHPID को अपनी स्पेशल स्टेट प्राप्त करने के लिए एक नए टर्मिनल सेशन का उपयोग करना होगा।

इस लेख के लिए बस इतना ही। हमने इस लेख में $$ और BASHPID के बीच अंतर और वे कैसे व्यवहार करते हैं, देखा है। इस लेख को पढ़ें और हमारे साथ अपनी बहुमूल्य प्रतिक्रिया साझा करें।

  1. - जावा में Process और Thread में अंतर

    इस पोस्ट में, हम जावा में प्रोसेस और थ्रेड के बीच अंतर को समझेंगे।Processयह निष्पादन में एक प्रोग्राम को संदर्भित करता है।प्रोसेस बनाने में अधिक समय लगता है।समाप्त होने में अधिक समय लगता है।कॉन्टेक्स्ट स्विच करने में अधिक समय लगता है।यह सिस्टम के अधिक संसाधनों का उपभोग करता है।यह संचार के मामले में

  1. - पायथन और बैश के बीच अंतर

    पायथनपायथन एक प्रोग्रामिंग भाषा है जिसे लागू करना सरल और समझना आसान बनाने के लिए डिज़ाइन किया गया है। यह एक डायनामिकली टाइप्ड भाषा है। यह पॉइंटर्स का उपयोग नहीं करता है।बैशबैश एक कमांड-लाइन इंटरप्रेटर है और लिनक्स और macOS ऑपरेटिंग सिस्टम में डिफ़ॉल्ट रूप से शिप किया जाता है। इसे अन्य ऑपरेटिंग सिस्ट

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

    इस लेख का मुख्य फोकस यह स्पष्ट रूप से समझना है कि जब आप bash में स्क्रिप्ट चलाते हैं बनाम source करते हैं तो क्या होता है। पहले, हम स्पष्ट रूप से समझेंगे कि प्रोग्राम कैसे सबमिट होता है जब आप स्क्रिप्ट को अलग-अलग तरीकों से कॉल करते हैं। नोट: एक्सटेंशन के साथ स्क्रिप्ट बनाने से कोई फर्क नहीं पड़ता।