Sužinokite skirtumą tarp $$ir $BASHPID Bash


Neseniai dirbau su apvalkalo scenarijumi ir pamačiau didelį skirtumą, kaip elgiasi specialieji bash kintamieji $ ir BASHPID. Kiekvienam procesui, vykdomam Linux sistemoje, bus priskirtas proceso ID ir taip operacinė sistema tvarko procesą.

Panašiai jūsų bash terminalo sesija taip pat bus priskirta proceso ID. Yra specialus kintamasis, vadinamas "$" ir "$BASHPID", kuris saugo dabartinio apvalkalo proceso ID.

Eikite į priekį ir paleiskite toliau pateiktą komandą, kad pamatytumėte, koks yra jūsų dabartinio apvalkalo proceso ID. Tiek "$", tiek "$BASHPID" grąžins tą pačią reikšmę.

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

Bash, kai iš apvalkalo iškviečiame bet kurią išorinę programą, bus sukurtas antrinis procesas/subshell ir programa bus pateikta tik antriniame procese. Žr. toliau pateiktą pavyzdį, kuriame įdėjau paprastą proceso stebėjimo komandą į scenarijų, pavadintą “sample.sh”, kad parodyčiau, kaip pirminis apvalkalas sukuria posluoksnį programai paleisti.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Dabar paleisdami šį scenarijų galime gauti bash proceso ID. Iš toliau pateikto paveikslėlio galite suprasti, kai iškviečiau scenarijų, bash sukuria antrinį procesą ir paleidžia scenarijų.

./sample.sh

Dabar scenarijuje naudokime ir „$“, ir „$BASHPID“ ir pažiūrėkime, ką jis pateikia.

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

Dabar paleiskite scenarijų dar kartą.

./sample.sh

Gerai, jis grąžina tą patį proceso ID. Čia iškyla tikrasis skirtumas. Scenarijaus viduje sukurkime kitą antrinį procesą, vykdydami komandą parenthes().

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"

Bash kalboje Skliausteliai iškvies antrinį procesą ir paleis viską, kas yra skliausteliuose. Tokiu atveju ir $, ir $BASHPID turėtų saugoti naują antrinį proceso ID. Tačiau iš aukščiau pateikto paveikslėlio matote skirtumą, kur $ saugo 382, kuris yra pirminis ID (scenarijaus proceso ID sample.sh), ir $BASHPID saugo sukurtą antrinio proceso ID, sukurtą skliausteliuose.

Dabar pabandykime suprasti šį elgesį. Pažiūrėsime, ką sako man puslapis.

man bash

Kai naudojate $, net ir antriniame apvalkale, jis išsaugo pirminio proceso ID, iš kurio buvo sukurtas. Tačiau BASHPID išsaugos dabartinį proceso ID, t. y. kai iškviečiamas skliausteliuose, išsaugos antrinį proceso ID.

Negalime priskirti ar modifikuoti kintamojo $, bet BASHPID galima priskirti iš naujo, bet tai neturi jokios įtakos.

$=10
BASHPID=10
echo $BASHPID

Galima išjungti BASHPID nustatymą. Kai atšaukiate nustatymus, jis praranda savo specialią būseną ir taip pat galite pradėti naudoti tai kaip įprastą kintamąjį.

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

Net jei bandysite priskirti apvalkalo proceso ID, jis bus traktuojamas kaip vartotojo apibrėžtas kintamasis, nes jis jau prarado savo specialią būseną.

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

Tokiu atveju turite naudoti naują BASHPID terminalo seansą, kad gautumėte specialią būseną.

Štai tiek šiam straipsniui. Šiame straipsnyje matėme skirtumą tarp $ ir BASHPID ir kaip jie elgiasi. Perskaitykite šį straipsnį ir pasidalykite vertingais atsiliepimais su mumis.