బాష్uలో $$మరియు $బాష్uపిడ్ మధ్య వ్యత్యాసాన్ని తెలుసుకోండి


ఇటీవల నేను షెల్ స్క్రిప్ట్uలో పని చేస్తున్నాను మరియు బాష్ స్పెషల్ వేరియబుల్ $ మరియు BASHPID ఎలా ప్రవర్తిస్తాయో దానిలో గణనీయమైన తేడా కనిపించింది. Linux లో నడుస్తున్న ప్రతి ప్రాసెస్uకు ప్రాసెస్ ID తో కేటాయించబడుతుంది మరియు ఆపరేటింగ్ సిస్టమ్ ఈ విధానాన్ని నిర్వహిస్తుంది.

అదేవిధంగా, మీ బాష్ టెర్మినల్ సెషన్ కూడా ప్రాసెస్ ID తో కేటాయించబడుతుంది. \"$\" మరియు \"AS BASHPID \" అని పిలువబడే ప్రత్యేక వేరియబుల్ ఉంది, ఇది ప్రస్తుత షెల్ యొక్క ప్రాసెస్ ID ని నిల్వ చేస్తుంది.

మీ ప్రస్తుత షెల్ యొక్క ప్రాసెస్ ID ఏమిటో చూడటానికి క్రింది ఆదేశాన్ని అమలు చేయండి. \"$\" మరియు \"AS BASHPID \" రెండూ ఒకే విలువను ఇవ్వబోతున్నాయి.

$ echo $$               # Printing special variable $
$ echo $BASHPID         # Printing the varibale $BASHPID

బాష్uలో మనం షెల్ నుండి ఏదైనా బాహ్య ప్రోగ్రామ్uను పిలిచినప్పుడు, అది చైల్డ్ ప్రాసెస్/సబ్uషెల్ సృష్టిస్తుంది మరియు ప్రోగ్రామ్ చైల్డ్ ప్రాసెస్uలో మాత్రమే సమర్పించబడుతుంది. పేరెంట్ షెల్ ప్రోగ్రామ్uను అమలు చేయడానికి సబ్uషెల్uను ఎలా సృష్టిస్తుందో చూపించడానికి “sample.sh” అని పిలువబడే స్క్రిప్ట్uలో సాధారణ ప్రాసెస్ మానిటర్ ఆదేశాన్ని ఉంచిన ఉదాహరణను క్రింద చూడండి.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

ఇప్పుడు ఈ స్క్రిప్ట్ నడుపుతున్నప్పుడు మనం బాష్ యొక్క ప్రాసెస్ ఐడిని పొందవచ్చు. దిగువ చిత్రం నుండి, నేను స్క్రిప్ట్ బాష్ అని పిలిచినప్పుడు మీరు చైల్డ్ ప్రాసెస్uను సృష్టించి, స్క్రిప్ట్uను రన్ చేస్తారు.

$ ./sample.sh

ఇప్పుడు స్క్రిప్ట్ లోపల \"$\" మరియు \"AS 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

ఇప్పుడు స్క్రిప్ట్uను మళ్లీ అమలు చేయండి.

$ ./sample.sh

సరే, ఇది అదే ప్రాసెస్ ID ని అందిస్తుంది. ఇక్కడ అసలు తేడా వస్తుంది. కుండలీకరణాలు() లోపల ఆదేశాన్ని అమలు చేయడం ద్వారా స్క్రిప్ట్ లోపల మరొక పిల్లల ప్రక్రియను సృష్టించండి.

# 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"

బాష్uలో, కుండలీకరణాలు పిల్లల ప్రక్రియను ప్రారంభిస్తాయి మరియు కుండలీకరణాల్లోకి వచ్చే వాటిని అమలు చేస్తాయి. అలాంటప్పుడు, $ మరియు $BASHPID రెండూ క్రొత్త పిల్లల ప్రాసెస్ ID ని నిల్వ చేయాలి. పై చిత్రం నుండి, $ 382 ను పేరెంట్ ID (స్క్రిప్ట్ నమూనా ID యొక్క ప్రాసెస్ ID) మరియు $BASHPID ని నిల్వ చేసే తేడా ఉన్నట్లు మీరు చూడవచ్చు. కుండలీకరణాలు సృష్టించిన చైల్డ్ ప్రాసెస్ ID ని నిల్వ చేస్తుంది.

ఇప్పుడు ఈ ప్రవర్తనను అర్థం చేసుకోవడానికి ప్రయత్నిద్దాం. మ్యాన్ పేజ్ ఏమి చెబుతుందో చూద్దాం.

$ man bash

మీరు $ ను ఉపయోగించినప్పుడు, సబ్uషెల్uలో కూడా, ఇది సృష్టించిన పేరెంట్ ప్రాసెస్ యొక్క ప్రాసెస్ ID ని నిల్వ చేస్తుంది. BASHPID ప్రస్తుత ప్రాసెస్ ID ని నిల్వ చేస్తుంది, అనగా కుండలీకరణాల లోపల పిలిచినప్పుడు అది పిల్లల ప్రాసెస్ ID ని నిల్వ చేస్తుంది.

మేము $ వేరియబుల్uను కేటాయించలేము లేదా సవరించలేము, కాని BASHPID ను తిరిగి కేటాయించవచ్చు కాని దాని ప్రభావం ఉండదు.

$ $=10
$ BASHPID=10
$ echo $BASHPID

BASHPID ని సెట్ చేయలేరు. మీరు సెట్ చేయనప్పుడు అది దాని ప్రత్యేక స్థితిని కోల్పోతుంది మరియు మీరు దీన్ని సాధారణ వేరియబుల్uగా ఉపయోగించడం ప్రారంభించవచ్చు.

$ unset BASHPID
$ echo $BASHPID
$ BASHPID="Tecmint"
$ echo $BASHPID

మీరు షెల్ యొక్క ప్రాసెస్ ఐడిని కేటాయించడానికి ప్రయత్నించినప్పటికీ, ఇది ఇప్పటికే దాని ప్రత్యేక స్థితిని కోల్పోయినందున ఇది వినియోగదారు నిర్వచించిన వేరియబుల్uగా పరిగణించబడుతుంది.

$ BASHPID=$(echo $$)
$ echo $$;echo $BASHPID

ఈ సందర్భంలో, మీరు BASHPID దాని ప్రత్యేక స్థితిని పొందడానికి కొత్త టెర్మినల్ సెషన్uను ఉపయోగించాలి.

ఈ వ్యాసం కోసం అది. $ మరియు BASHPID ల మధ్య వ్యత్యాసాన్ని మరియు ఈ వ్యాసంలో వారు ఎలా ప్రవర్తిస్తారో మేము చూశాము. ఈ వ్యాసం ద్వారా వెళ్లి మీ విలువైన అభిప్రాయాన్ని మాతో పంచుకోండి.