Tanuljon meg különbséget a $$és a $BASHPID között Bash nyelven
Nemrég dolgoztam egy shell szkripten, és jelentős különbséget láttam a $
és BASHPID
speciális bash változók viselkedésében. Minden Linux alatt futó folyamathoz hozzá lesz rendelve egy folyamat azonosítója, és az operációs rendszer így kezeli a folyamatot.
Hasonlóképpen, a bash terminál munkamenethez is hozzá lesz rendelve egy folyamatazonosító. Van egy "$"
és "$BASHPID"
nevű speciális változó, amely az aktuális shell folyamatazonosítóját tárolja.
Menjen előre, és futtassa az alábbi parancsot, hogy megtudja, mi az aktuális shell folyamatazonosítója. A "$"
és a "$BASHPID"
is ugyanazt az értéket adja vissza.
echo $$ # Printing special variable $
echo $BASHPID # Printing the varibale $BASHPID
A bash-ban, amikor bármilyen külső programot hívunk meg a shell-ből, az utódfolyamatot/alhéjat hoz létre, és a program csak a gyermekfolyamatban lesz elküldve. Lásd az alábbi példát, ahol egy egyszerű folyamatfigyelő parancsot helyezek el egy „sample.sh” nevű szkriptben, hogy bemutassam, hogyan hoz létre a szülő shell egy alhéjat a program futtatásához.
#!/usr/bin/env bash
ps -ef --forest | grep -i bash
Most a szkript futtatásakor megkapjuk a bash folyamatazonosítóját. Az alábbi képből megértheti, hogy amikor hívtam a szkriptet, a bash létrehoz egy gyermekfolyamatot, és futtatja a szkriptet.
./sample.sh
Most használjuk a "$"
és a "$BASHPID"
értéket is a szkripten belül, és nézzük meg, mit ad vissza.
#!/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
Most futtassa újra a szkriptet.
./sample.sh
Rendben, ugyanazt a folyamatazonosítót adja vissza. Itt jön a tényleges különbség. Hozzon létre egy másik utódfolyamatot a szkripten belül a parenthes()
-en belüli parancs futtatásával.
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"
A bash-ban a Zárójelek egy gyermekfolyamatot hív meg, és lefuttat mindent, ami a zárójelben található. Ebben az esetben a $
és a $BASHPID
is tároljon egy új alárendelt folyamatazonosítót. De a fenti képen láthatja, hogy van különbség, hogy a $
hol tárolja a 382-t, amely a szülő azonosító (a sample.sh szkript folyamatazonosítója) ), és a $BASHPID
tárolja a zárójelben létrehozott gyermekfolyamat-azonosítót.
Most próbáljuk megérteni ezt a viselkedést. Meglátjuk mit mond a man oldal.
man bash
Ha a $
elemet használja, még egy alhéjban is, tárolja annak a szülőfolyamatnak a folyamatazonosítóját, amelyből létrehozta. De a BASHPID
tárolja az aktuális folyamatazonosítót, azaz amikor zárójelben hívják, tárolja a gyermek folyamatazonosítót.
A $
változót nem tudjuk hozzárendelni vagy módosítani, de a BASHPID
átrendelhető, de ennek nincs hatása.
$=10
BASHPID=10
echo $BASHPID
Lehetőség van a BASHPID beállításának kikapcsolására. Ha kikapcsolja, elveszti speciális állapotát, és ezt is használhatja normál változóként.
unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID
Még ha megpróbálja is hozzárendelni a shell folyamatazonosítóját, a rendszer felhasználói változóként kezeli, mivel már elvesztette speciális állapotát.
BASHPID=$(echo $$)
echo $$;echo $BASHPID
Ebben az esetben új terminálmunkamenetet kell használnia a BASHPID számára a speciális állapot eléréséhez.
Ennyit ehhez a cikkhez. Ebben a cikkben láthattuk a különbséget a $
és a BASHPID
között, és hogyan viselkednek. Olvassa el ezt a cikket, és ossza meg velünk értékes visszajelzéseit.