Wyszukiwanie w witrynie

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ą.