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.