Naučite se razlike med $$in $BASHPID v Bashu


Pred kratkim sem delal na skriptu lupine in videl sem pomembno razliko v tem, kako se obnašata posebna spremenljivka bash $ in BASHPID . Vsakemu procesu, ki se izvaja v Linuxu, bo dodeljen ID procesa in tako operacijski sistem obravnava postopek.

Podobno bo tudi vaši terminalski seji bash dodeljen ID procesa. Obstaja posebna spremenljivka, imenovana \"$\" in \"$BASHPID \" , ki shrani ID procesa trenutne lupine.

Pojdite naprej in zaženite spodnji ukaz, da vidite, kakšen je ID procesa vaše trenutne lupine. Tako \"$\" kot \"$BASHPID \" bosta vrnili isto vrednost.

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

Ko v lupini iz lupine pokličemo kateri koli zunanji program, bo ustvaril podrejeni proces/podlupino in program bo predložen samo v podrejenem procesu. Glejte spodnji primer, kjer sem v skript, imenovan »sample.sh«, dal preprost ukaz za nadzor procesa, da dokažem, kako nadrejena lupina ustvari podlupino za zagon programa.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Zdaj pri zagonu tega skripta lahko dobimo ID procesa bash. Iz spodnje slike lahko razumete, kdaj sem poklical skript bash ustvari podrejeni postopek in zažene skript.

$ ./sample.sh

Zdaj uporabimo \"$\" in \"$BASHPID \" znotraj skripta in si oglejmo, kaj vrne.

#!/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

Zdaj znova zaženite skript.

$ ./sample.sh

V redu, vrne isti ID procesa. Tu prihaja dejanska razlika. Ustvarimo še en podrejeni postopek znotraj skripta, tako da zaženemo ukaz znotraj oklepajev() .

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

V bash bodo oklepaji poklicali podrejeni postopek in zagnali vse, kar je v oklepajih. V tem primeru morata $ in $BASHPID shraniti nov ID podrejenega procesa. Toda na zgornji sliki lahko vidite, da obstaja razlika, kjer $ shrani 382, ki je nadrejeni ID (ID procesa skripta sample.sh), in $BASHPID shrani ustvarjeni podrejeni ID procesa, ustvarjen v oklepajih.

Zdaj poskusimo razumeti to vedenje. Bomo videli, kaj piše na strani z navodili.

$ man bash

Ko uporabljate $, tudi v podlupini shrani ID procesa nadrejenega procesa, iz katerega je bil ustvarjen. Toda BASHPID bo shranil trenutni ID procesa, tj. Ko bo poklican v oklepajih, bo shranil podrejeni ID procesa.

Spremenljivke $ ne moremo dodeliti ali spremeniti, toda BASHPID je mogoče dodeliti, vendar nima učinka.

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

Možno je izključiti BASHPID. Ko to nastavite, izgubi posebno stanje in jo lahko začnete uporabljati kot običajno spremenljivko.

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

Tudi če poskusite dodeliti ID procesa lupine, bo obravnavana kot uporabniško določena spremenljivka, saj je že izgubila svoje posebno stanje.

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

V tem primeru morate uporabiti novo terminalsko sejo za BASHPID, da dobite njegovo posebno stanje.

To je to za ta članek. V tem članku smo videli razliko med $ in BASHPID in njihovim obnašanjem. Preberite ta članek in delite svoje dragocene povratne informacije z nami.