Weboldal keresés

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.