Naučite razliku između $$i $BASHPID u Bashu


Nedavno sam radio na skripti ljuske i vidio sam značajnu razliku u tome kako se ponašaju bash posebne varijable $ i BASHPID. Svakom procesu koji se izvodi u Linuxu bit će dodijeljen ID procesa i to je način na koji operativni sustav rukuje procesom.

Slično tome, vašoj sesiji bash terminala također će biti dodijeljen ID procesa. Postoji posebna varijabla pod nazivom "$" i "$BASHPID" koja pohranjuje ID procesa trenutne ljuske.

Samo naprijed i pokrenite donju naredbu da vidite koji je ID procesa vaše trenutne ljuske. I "$" i "$BASHPID" vratit će istu vrijednost.

echo $$               # Printing special variable $
echo $BASHPID         # Printing the varibale $BASHPID

U bashu kada pozovemo bilo koji vanjski program iz ljuske, on će stvoriti podređeni proces/podljusku i program će biti poslan samo u podređeni proces. Pogledajte donji primjer gdje sam stavio jednostavnu naredbu za nadgledanje procesa u skriptu pod nazivom “sample.sh” da pokažem kako nadređena ljuska stvara podljusku za pokretanje programa.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Sada kada pokrenemo ovu skriptu možemo dobiti ID procesa bash. Iz donje slike možete shvatiti kada sam nazvao skriptu, bash stvara podređeni proces i pokreće skriptu.

./sample.sh

Upotrijebimo sada i "$" i "$BASHPID" unutar skripte i pogledajmo što vraća.

#!/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

Sada ponovno pokrenite skriptu.

./sample.sh

U redu, vraća isti ID procesa. Ovdje dolazi stvarna razlika. Kreirajmo još jedan podređeni proces unutar skripte izvođenjem naredbe unutar 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"

U bashu, Zagrade će pozvati podređeni proces i pokrenuti sve što dođe unutar zagrada. U tom slučaju, i $ i $BASHPID trebaju pohraniti novi ID podređenog procesa. Ali iz gornje slike možete vidjeti da postoji razlika gdje $ pohranjuje 382 što je nadređeni ID (ID procesa skripte sample.sh), a $BASHPID pohranjuje kreirani ID podređenog procesa kreiran pomoću zagrada.

Pokušajmo sada razumjeti ovo ponašanje. Vidjet ćemo što kaže man stranica.

man bash

Kada koristite $, čak iu podljusci, on pohranjuje ID procesa nadređenog procesa iz kojeg je kreiran. Ali BASHPID će pohraniti trenutni ID procesa, tj. kada se pozove unutar zagrada, pohranit će ID procesa djeteta.

Ne možemo dodijeliti ili modificirati varijablu $, ali BASHPID se može ponovno dodijeliti, ali to nema učinka.

$=10
BASHPID=10
echo $BASHPID

Moguće je poništiti BASHPID. Kada ga poništite, gubi svoje posebno stanje, a također možete početi koristiti ovo kao normalnu varijablu.

unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID

Čak i ako pokušate dodijeliti ID procesa ljuske, on će se tretirati kao korisnički definirana varijabla jer je već izgubio svoje posebno stanje.

BASHPID=$(echo $$)
echo $$;echo $BASHPID

U ovom slučaju, morate upotrijebiti novu sesiju terminala za BASHPID da dobijete njegovo posebno stanje.

To je to za ovaj članak. Vidjeli smo razliku između $ i BASHPID i kako se ponašaju u ovom članku. Pregledajte ovaj članak i podijelite svoje vrijedne povratne informacije s nama.