Vyhledávání na webu

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.