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


Nedavno sam radio na shell skripti i vidio sam značajnu razliku u ponašanju bash posebnih varijabli $ i BASHPID. Svakom procesu koji se izvodi u Linuxu bit će dodijeljen proces ID i na taj način operativni sistem upravlja procesom.

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

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

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

U bash-u kada pozovemo bilo koji eksterni program iz ljuske, on će kreirati podređeni proces/podljusku i program će biti dostavljen samo u podređenom procesu. Pogledajte donji primjer gdje sam stavio jednostavnu komandu za praćenje procesa u skriptu pod nazivom “sample.sh” da pokažem kako roditeljska ljuska kreira 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-a. Sa donje slike možete razumjeti kada sam nazvao skriptu bash kreira podređeni proces i pokreće skriptu.

./sample.sh

Sada koristimo i "$" i "$BASHPID" unutar skripte i vidimo šta 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 ponovo pokrenite skriptu.

./sample.sh

U redu, vraća isti ID procesa. Ovdje dolazi stvarna razlika. Kreirajmo još jedan podređeni proces unutar skripte pokretanjem naredbe unutar zagrada().

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 bash-u, Zagrade će pozvati podređeni proces i pokrenuti sve što dođe unutar zagrada. U tom slučaju, i $ i $BASHPID bi trebali pohraniti novi ID podređenog procesa. Ali iz gornje slike možete vidjeti da postoji razlika gdje $ pohranjuje 382 što je roditeljski ID (ID procesa skripte sample.sh), a $BASHPID pohranjuje kreirani podređeni ID procesa kreiran zagradama.

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

man bash

Kada koristite $, čak iu podljusci, ona pohranjuje ID procesa nadređenog procesa od 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 ponovo dodijeliti, ali to nema efekta.

$=10
BASHPID=10
echo $BASHPID

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

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

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

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

U ovom slučaju, morate koristiti novu terminalsku sesiju za BASHPID da biste dobili njegovo posebno stanje.

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