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.