Naučte se rozdíl mezi $$a $BASHPID v Bash
Nedávno jsem pracoval na skriptu shellu a viděl jsem významný rozdíl v tom, jak se chová speciální proměnná bash $
a BASHPID
. Každému procesu běžícímu v Linuxu bude přiřazeno ID procesu a podle toho operační systém s procesem nakládá.
Podobně bude vaší relaci bash terminálu přiřazeno také ID procesu. Existuje speciální proměnná nazvaná "$"
a "$BASHPID"
, která ukládá ID procesu aktuálního shellu.
Pokračujte a spusťte níže uvedený příkaz, abyste viděli, jaké je ID procesu vašeho aktuálního shellu. "$"
i "$BASHPID"
vrátí stejnou hodnotu.
echo $$ # Printing special variable $
echo $BASHPID # Printing the varibale $BASHPID
Když v bash zavoláme jakýkoli externí program z shellu, vytvoří se podřízený proces/podshell a program bude odeslán pouze v podřízeném procesu. Podívejte se na níže uvedený příklad, kde jsem do skriptu s názvem “sample.sh” vložil jednoduchý příkaz monitorování procesů, abych demonstroval, jak nadřazený shell vytváří podshell pro spuštění programu.
#!/usr/bin/env bash
ps -ef --forest | grep -i bash
Nyní při spuštění tohoto skriptu můžeme získat ID procesu bash. Z níže uvedeného obrázku můžete pochopit, když jsem nazval skript bash, vytvoří podřízený proces a spustí skript.
./sample.sh
Nyní ve skriptu použijeme "$"
i "$BASHPID"
a uvidíme, co vrátí.
#!/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
Nyní spusťte skript znovu.
./sample.sh
Dobře, vrací stejné ID procesu. Zde přichází skutečný rozdíl. Vytvořme další podřízený proces uvnitř skriptu spuštěním příkazu uvnitř parentheses()
.
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"
V bash Závorky vyvolá podřízený proces a spustí vše, co je v závorkách. V takovém případě by $
i $BASHPID
měly uložit nové ID podřízeného procesu. Ale z obrázku výše můžete vidět, že je rozdíl, kde $
ukládá 382, což je rodičovské ID (ID procesu skriptu sample.sh) a $BASHPID
ukládá vytvořené ID podřízeného procesu vytvořené v závorkách.
Nyní se pokusme toto chování pochopit. Uvidíme, co řekne manuálová stránka.
man bash
Když použijete $
, dokonce i v dílčím prostředí, uloží ID procesu nadřazeného procesu, ze kterého byl vytvořen. Ale BASHPID
uloží aktuální ID procesu, tj. když je voláno v závorkách, uloží ID podřízeného procesu.
Nemůžeme přiřadit nebo upravit proměnnou $
, ale BASHPID
lze znovu přiřadit, ale nemá to žádný účinek.
$=10
BASHPID=10
echo $BASHPID
Je možné zrušit nastavení BASHPIDA. Když nastavení zrušíte, ztratí svůj speciální stav a také jej můžete začít používat jako normální proměnnou.
unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID
I když se pokusíte přiřadit ID procesu shellu, bude s ním zacházeno jako s uživatelem definovanou proměnnou, protože již ztratila svůj speciální stav.
BASHPID=$(echo $$)
echo $$;echo $BASHPID
V tomto případě musíte použít novou relaci terminálu pro BASHPID, abyste získali jeho speciální stav.
To je pro tento článek vše. V tomto článku jsme viděli rozdíl mezi $
a BASHPID
a jak se chovají. Projděte si tento článek a podělte se s námi o svou cennou zpětnou vazbu.