Lær forskjellen mellom $$og $BASHPID i Bash
Nylig jobbet jeg med et shell-skript, og jeg så en betydelig forskjell i hvordan bash-spesialvariabelen $
og BASHPID
oppfører seg. Hver prosess som kjører i Linux vil bli tildelt en prosess ID og det er hvordan operativsystemet håndterer prosessen.
På samme måte vil bash-terminaløkten også bli tildelt en prosess-ID. Det er en spesiell variabel kalt "$"
og "$BASHPID"
som lagrer prosess-IDen til gjeldende skall.
Gå videre og kjør kommandoen nedenfor for å se hva som er prosess-IDen til ditt nåværende skall. Både "$"
og "$BASHPID"
kommer til å returnere samme verdi.
echo $$ # Printing special variable $
echo $BASHPID # Printing the varibale $BASHPID
I bash når vi kaller et eksternt program fra skallet, vil det lage en underordnet prosess/subshell, og programmet sendes kun inn i den underordnede prosessen. Se eksempel nedenfor hvor jeg legger inn en enkel prosessovervåkingskommando i et skript kalt “sample.sh” for å demonstrere hvordan det overordnede skallet lager et underskall for å kjøre programmet.
#!/usr/bin/env bash
ps -ef --forest | grep -i bash
Nå når vi kjører dette skriptet, kan vi få prosess-IDen til bash. Fra bildet nedenfor kan du forstå når jeg kalte scriptet bash oppretter en underordnet prosess og kjører skriptet.
./sample.sh
La oss nå bruke både "$"
og "$BASHPID"
inne i skriptet og se hva det returnerer.
#!/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
Kjør nå skriptet på nytt.
./sample.sh
Greit, den returnerer samme prosess-ID. Her kommer den faktiske forskjellen. La oss lage en annen underordnet prosess inne i skriptet ved å kjøre en kommando innenfor parentes()
.
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"
I bash vil Pparenteser starte en underordnet prosess og kjøre det som kommer innenfor parentesen. I så fall bør både $
og $BASHPID
lagre en ny underordnet prosess-ID. Men fra bildet ovenfor kan du se at det er en forskjell der $
lagrer 382 som er overordnet ID (Prosess-ID for skriptet sample.sh), og $BASHPID
lagrer den opprettede underordnede prosess-IDen opprettet i parentes.
La oss nå prøve å forstå denne oppførselen. Vi får se hva man-siden sier.
man bash
Når du bruker $
, selv i et subshell, lagrer det prosess-IDen til overordnet prosessen den ble opprettet fra. Men BASHPID
vil lagre gjeldende prosess-ID, dvs. når den kalles innenfor parentes, vil den lagre den underordnede prosess-IDen.
Vi kan ikke tilordne eller endre variabelen $
, men BASHPID
kan tilordnes på nytt, men det har ingen effekt.
$=10
BASHPID=10
echo $BASHPID
Det er mulig å deaktivere BASHPID. Når du deaktiverer, mister den sin spesielle tilstand, og du kan også begynne å bruke denne som en normal variabel.
unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID
Selv om du prøver å tilordne prosess-IDen til skallet, vil den bli behandlet som en brukerdefinert variabel siden den allerede har mistet sin spesielle tilstand.
BASHPID=$(echo $$)
echo $$;echo $BASHPID
I dette tilfellet må du bruke en ny terminaløkt for BASHPID for å få dens spesielle tilstand.
Det er det for denne artikkelen. Vi har sett forskjellen mellom $
og BASHPID
og hvordan de oppfører seg i denne artikkelen. Gå gjennom denne artikkelen og del din verdifulle tilbakemelding med oss.