Poznaj różnicę między $$i $BASHPID w Bash
Ostatnio pracowałem nad skryptem powłoki i zauważyłem znaczącą różnicę w zachowaniu specjalnych zmiennych bash $
i BASHPID
. Każdemu procesowi działającemu w Linuksie zostanie przypisany proces ID i w ten sposób system operacyjny obsługuje ten proces.
Podobnie sesja terminala bash zostanie również przypisana do identyfikatora procesu. Istnieje specjalna zmienna o nazwie "$"
i "$BASHPID"
, która przechowuje identyfikator procesu bieżącej powłoki.
Śmiało, uruchom poniższe polecenie, aby zobaczyć, jaki jest identyfikator procesu Twojej bieżącej powłoki. Zarówno "$"
, jak i "$BASHPID"
zwrócą tę samą wartość.
echo $$ # Printing special variable $
echo $BASHPID # Printing the varibale $BASHPID
W bashu, gdy wywołamy dowolny program zewnętrzny z powłoki, utworzy on proces potomny/podpowłokę, a program zostanie przesłany tylko w procesie potomnym. Zobacz poniższy przykład, w którym umieściłem proste polecenie monitorowania procesu w skrypcie o nazwie „sample.sh”, aby zademonstrować, w jaki sposób powłoka nadrzędna tworzy podpowłokę do uruchomienia programu.
#!/usr/bin/env bash
ps -ef --forest | grep -i bash
Teraz po uruchomieniu tego skryptu możemy uzyskać identyfikator procesu bash. Z poniższego obrazu możesz zrozumieć, kiedy wywołałem skrypt, bash tworzy proces potomny i uruchamia skrypt.
./sample.sh
Teraz użyjmy wewnątrz skryptu zarówno "$"
, jak i "$BASHPID"
i zobaczmy, co zwróci.
#!/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
Teraz uruchom skrypt ponownie.
./sample.sh
W porządku, zwraca ten sam identyfikator procesu. Tutaj pojawia się faktyczna różnica. Stwórzmy w skrypcie kolejny proces potomny, uruchamiając polecenie wewnątrz 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"
W bashu Nawiasy wywołają proces potomny i uruchomią wszystko, co znajduje się w nawiasach. W takim przypadku zarówno $
, jak i $BASHPID
powinny przechowywać nowy identyfikator procesu potomnego. Ale na powyższym obrazku widać różnicę, gdzie $
przechowuje 382, który jest identyfikatorem nadrzędnym (identyfikator procesu skryptu sample.sh), a $BASHPID
przechowuje utworzony identyfikator procesu potomnego utworzony w nawiasach.
Spróbujmy teraz zrozumieć to zachowanie. Zobaczymy, co powie strona podręcznika.
man bash
Kiedy używasz $
, nawet w podpowłoce, przechowuje on identyfikator procesu nadrzędnego, z którego został utworzony. Ale BASHHPID
będzie przechowywać bieżący identyfikator procesu, tj. wywołany w nawiasach będzie przechowywać identyfikator procesu potomnego.
Nie możemy przypisać ani zmodyfikować zmiennej $
, ale BASHHPID
można przypisać ponownie, ale nie ma to żadnego efektu.
$=10
BASHPID=10
echo $BASHPID
Możliwe jest rozbrojenie BASHHPID. Po rozbrojeniu traci swój specjalny stan i możesz zacząć używać tej zmiennej jako normalnej zmiennej.
unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID
Nawet jeśli spróbujesz przypisać identyfikator procesu powłoki, będzie on traktowany jako zmienna zdefiniowana przez użytkownika, ponieważ utraciła już swój specjalny stan.
BASHPID=$(echo $$)
echo $$;echo $BASHPID
W takim przypadku musisz użyć nowej sesji terminala dla BASHHPID, aby uzyskać jego specjalny stan.
To wszystko w tym artykule. W tym artykule widzieliśmy różnicę między $
i BASHHPID
oraz ich zachowanie. Zapoznaj się z tym artykułem i podziel się z nami swoją cenną opinią.