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.