Opi ero $$ja $BASHPID välillä bashissa
Työskentelin äskettäin komentosarjan parissa ja huomasin merkittävän eron bash-erikoismuuttujien $
ja BASHPID
käyttäytymisessä. Jokaiselle Linuxissa käynnissä olevalle prosessille määritetään prosessin ID, ja näin käyttöjärjestelmä käsittelee prosessia.
Samoin bash-pääteistunnollesi määritetään prosessitunnus. On olemassa erityinen muuttuja nimeltä "$"
ja "$BASHPID"
, joka tallentaa nykyisen komentotulkin prosessitunnuksen.
Mene eteenpäin ja suorita alla oleva komento nähdäksesi, mikä on nykyisen kuoresi prosessitunnus. Sekä "$"
ja "$BASHPID"
palauttavat saman arvon.
echo $$ # Printing special variable $
echo $BASHPID # Printing the varibale $BASHPID
Bashissa kun kutsumme mitä tahansa ulkoista ohjelmaa kuoresta, se luo aliprosessin/alikuoren ja ohjelma lähetetään vain aliprosessissa. Katso alla esimerkki, jossa laitan yksinkertaisen prosessinvalvontakomennon "sample.sh"-nimiseen komentosarjaan osoittaakseni, kuinka ylätason komentotulkki luo alikuoren ohjelman suorittamista varten.
#!/usr/bin/env bash
ps -ef --forest | grep -i bash
Nyt kun suoritat tätä komentosarjaa, voimme saada bashin prosessitunnuksen. Alla olevasta kuvasta voit ymmärtää, kun kutsuin komentosarjaa bash luo lapsiprosessin ja suorita komentosarjan.
./sample.sh
Käytetään nyt sekä "$"
että "$BASHPID"
komentosarjassa ja katsotaan, mitä se palauttaa.
#!/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
Suorita nyt skripti uudelleen.
./sample.sh
Selvä, se palauttaa saman prosessitunnuksen. Tässä tulee todellinen ero. Luodaan toinen aliprosessi komentosarjan sisälle suorittamalla komento parenheses()
sisällä.
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"
Bashissa sulut käynnistää alatason prosessin ja suorittaa sen, mitä suluissa on. Siinä tapauksessa sekä $
että $BASHPID
pitäisi tallentaa uusi aliprosessitunnus. Mutta yllä olevasta kuvasta näet eron, missä $
tallentaa 382:n, joka on ylätason tunnus (skriptin sample.sh prosessitunnus) ), ja $BASHPID
tallentaa suluilla luodun aliprosessitunnuksen.
Yritetään nyt ymmärtää tämä käyttäytyminen. Katsotaan mitä man-sivu sanoo.
man bash
Kun käytät koodia $
, se tallentaa jopa alikuoressa sen pääprosessin prosessitunnuksen, josta se on luotu. Mutta BASHPID
tallentaa nykyisen prosessin tunnuksen, eli kun sitä kutsutaan suluissa, se tallentaa aliprosessin tunnuksen.
Emme voi määrittää tai muokata muuttujaa $
, mutta BASHPID
voidaan määrittää uudelleen, mutta sillä ei ole vaikutusta.
$=10
BASHPID=10
echo $BASHPID
BASHPID-asetus voidaan poistaa. Kun poistat asetuksen, se menettää erikoistilan ja voit myös alkaa käyttää tätä normaalimuuttujana.
unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID
Vaikka yrität määrittää kuoren prosessitunnuksen, sitä käsitellään käyttäjän määrittämänä muuttujana, koska se on jo menettänyt erityistilansa.
BASHPID=$(echo $$)
echo $$;echo $BASHPID
Tässä tapauksessa sinun on käytettävä uutta pääteistuntoa BASHPID:lle saadaksesi sen erikoistilan.
Siinä se tälle artikkelille. Olemme havainneet tässä artikkelissa eron $
- ja BASHPID
- ja niiden toiminnan välillä. Käy tämä artikkeli läpi ja jaa arvokas palautteesi kanssamme.