Õppige Bashis erinevust $$ja $BASHPID vahel
Hiljuti töötasin shelliskripti kallal ja nägin olulist erinevust selles, kuidas bashi erimuutuja $
ja BASHPID
käitub. Igale Linuxis töötavale protsessile määratakse protsessi ID ja nii opsüsteem protsessiga tegeleb.
Samamoodi määratakse teie bashi terminali seansile ka protsessi ID. On olemas spetsiaalne muutuja nimega "$"
ja "$BASHPID"
, mis salvestab praeguse kesta protsessi ID.
Minge edasi ja käivitage järgmine käsk, et näha, milline on teie praeguse kesta protsessi ID. Nii "$"
kui ka "$BASHPID"
tagastavad sama väärtuse.
$ echo $$ # Printing special variable $ $ echo $BASHPID # Printing the varibale $BASHPID
Kui kutsume shellist mis tahes välise programmi, loob see bash-protsessori/alamkesta ja programm esitatakse ainult alamprotsessis. Vaadake allpool näidet, kus ma panin skripti nimega "sample.sh" lihtsa protsessimonitori käsu, et näidata, kuidas vanemkoor loob programmi käivitamiseks alamkesta.
#!/usr/bin/env bash ps -ef --forest | grep -i bash
Nüüd saame selle skripti käivitamisel saada bashi protsessi ID. Allolevalt pildilt saate aru, kui ma kutsusin skripti, bash loob lapseprotsessi ja käivitab skripti.
$ ./sample.sh
Kasutame nüüd skripti sees nii "$"
kui ka "$BASHPID"
ja vaatame, mida see tagastab.
#!/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
Nüüd käivitage skript uuesti.
$ ./sample.sh
Hea küll, see tagastab sama protsessi ID. Siit tuleb tegelik erinevus. Looge skripti sees veel üks alamprotsess, käivitades käsu sulgudes()
.
# 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"
Bashis käivitavad sulgud lapseprotsessi ja käivitavad kõik, mis sulgudes sees on. Sel juhul peaksid nii $
kui ka $BASHPID
salvestama uue alamprotsessi ID. Kuid ülaltoodud pildi järgi on erinevus, kus $
salvestab 382, mis on vanema ID (skripti sample.sh protsessi ID), ja $BASHPID
salvestab sulude loodud loodud lapseprotsessi ID.
Proovime nüüd sellest käitumisest aru saada. Näeme, mida ütleb man leht.
$ man bash
Kui kasutate $
, isegi alamkihis, salvestab see selle loodud vanemprotsessi protsessi ID. Kuid BASHPID
salvestab praeguse protsessi ID, st kui sulgudes helistatakse, siis see salvestab lapse protsessi ID.
Me ei saa muutujat $
omistada ega muuta, kuid BASHPID
saab ümber määrata, kuid sellel pole mingit mõju.
$ $=10 $ BASHPID=10 $ echo $BASHPID
BASHPID on võimalik tühistada. Kui te selle tühistate, kaotab see oma eriseisundi ja võite hakata seda kasutama ka tavalise muutujana.
$ unset BASHPID $ echo $BASHPID $ BASHPID="Tecmint" $ echo $BASHPID
Isegi kui proovite määrata kesta protsessi ID-d, käsitletakse seda kasutaja määratletud muutujana, kuna see kaotas juba oma eriseisundi.
$ BASHPID=$(echo $$) $ echo $$;echo $BASHPID
Sellisel juhul peate oma eriseisundi saamiseks kasutama BASHPID jaoks uut terminaliseanssi.
See on selle artikli jaoks. Selles artiklis oleme näinud erinevust $
ja BASHPID
vahel ning nende käitumist. Vaadake see artikkel läbi ja jagage meiega oma väärtuslikku tagasisidet.