Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> बाश प्रोग्रामिंग

बश में $$ और $BASHPID के बीच अंतर जानें

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

संबंधित पढ़ें :Bash . में सोर्सिंग और फोर्किंग के बीच अंतर जानें

इसी तरह, आपका बैश टर्मिनल सत्र भी एक प्रक्रिया आईडी के साथ सौंपा जाएगा। "$" . नामक एक विशेष चर है और "$BASHPID" जो मौजूदा शेल की प्रोसेस आईडी को स्टोर करता है।

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

$ echo $$               # Printing special variable $
$ echo $BASHPID         # Printing the varibale $BASHPID
बश में $$ और $BASHPID के बीच अंतर जानें

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

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

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

$ ./sample.sh
बश में $$ और $BASHPID के बीच अंतर जानें बश में $$ और $BASHPID के बीच अंतर जानें

आइए अब दोनों "$" . का उपयोग करें और "$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
बश में $$ और $BASHPID के बीच अंतर जानें बश में $$ और $BASHPID के बीच अंतर जानें

ठीक है, यह वही प्रक्रिया आईडी देता है। यहाँ वास्तविक अंतर आता है। आइए 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 के बीच अंतर जानें बश में $$ और $BASHPID के बीच अंतर जानें

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

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

$ man bash
बश में $$ और $BASHPID के बीच अंतर जानें बश में $$ और $BASHPID के बीच अंतर जानें बश में $$ और $BASHPID के बीच अंतर जानें बश में $$ और $BASHPID के बीच अंतर जानें

जब आप $ . का उपयोग करते हैं , यहां तक ​​​​कि एक सबहेल में, यह उस मूल प्रक्रिया की प्रक्रिया आईडी को संग्रहीत करता है जिससे इसे बनाया गया था। लेकिन BASHPID वर्तमान प्रक्रिया आईडी को संग्रहीत करेगा, अर्थात जब कोष्ठक के अंदर कहा जाता है तो यह चाइल्ड प्रोसेस आईडी को संग्रहीत करेगा।

हम वैरिएबल $ . को असाइन या संशोधित नहीं कर सकते हैं , लेकिन BASHPID पुन:असाइन किया जा सकता है लेकिन इसका कोई प्रभाव नहीं पड़ता है।

$ $=10
$ BASHPID=10
$ echo $BASHPID
बश में $$ और $BASHPID के बीच अंतर जानें

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

$ unset BASHPID
$ echo $BASHPID
$ BASHPID="Tecmint"
$ echo $BASHPID
बश में $$ और $BASHPID के बीच अंतर जानें

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

$ BASHPID=$(echo $$)
$ echo $$;echo $BASHPID
बश में $$ और $BASHPID के बीच अंतर जानें

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

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


  1. जावा में प्रोसेस और थ्रेड के बीच अंतर

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

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

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

  1. Bash . में सोर्सिंग और फोर्किंग के बीच अंतर जानें

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