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.