Õ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.