Uzziniet atšķirību starp $$un $BASHPID Bashā


Nesen es strādāju pie čaulas skripta, un es redzēju būtiskas atšķirības tajā, kā darbojas īpašais mainīgais $ un BASHPID . Katram procesam, kas darbojas Linux, tiks piešķirts procesa ID, un tieši tā operētājsistēma apstrādā procesu.

Līdzīgi arī jūsu bash termināla sesijai tiks piešķirts procesa ID. Ir īpašs mainīgais ar nosaukumu "$" un "$BASHPID" , kas saglabā pašreizējā čaulas procesa ID.

Pārejiet uz priekšu un palaidiet zemāk esošo komandu, lai redzētu, kāds ir jūsu pašreizējā čaulas procesa ID. Gan "$" , gan "$BASHPID" atgriezīs to pašu vērtību.

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

Ja mēs no čaumalas izsaucam jebkuru ārēju programmu, tas izveidos bērnu procesu/apakšvisi, un programma tiks iesniegta tikai pakārtotajā procesā. Skatiet zemāk redzamo piemēru, kurā es ievietoju vienkāršu procesa monitora komandu skriptā ar nosaukumu “sample.sh”, lai parādītu, kā vecākā čaula izveido apakšizlāni, lai palaistu programmu.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Tagad, palaižot šo skriptu, mēs varam iegūt bash procesa ID. No zemāk redzamā attēla jūs varat saprast, kad es saucu skriptu, ka bash izveido bērnu procesu un palaiž skriptu.

$ ./sample.sh

Tagad skriptā izmantosim gan "$" , gan "$BASHPID" un redzēsim, ko tas atdod.

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

Tagad palaidiet skriptu vēlreiz.

$ ./sample.sh

Labi, tas atgriež to pašu procesa ID. Šeit nāk faktiskā atšķirība. Izveidosim vēl vienu pakārtoto procesu skripta iekšpusē, palaižot komandu iekavās() .

# 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"

Bashā iekavas atsauksies uz bērnu procesu un palaidīs visu, kas atrodas iekavās. Tādā gadījumā gan $, gan $BASHPID būtu jāuzglabā jauns pakārtotā procesa ID. No iepriekš minētā attēla var redzēt, ka ir atšķirība, kur $ tiek glabāti 382, kas ir vecāku ID (skripta sample.sh procesa ID), un $BASHPID glabā izveidoto bērnu procesu ID, kas izveidots iekavās.

Tagad mēģināsim izprast šo uzvedību. Mēs redzēsim, ko saka man lapa.

$ man bash

Ja izmantojat $, pat apakšvāciņā tas saglabā vecāku procesa procesa ID, no kura tas tika izveidots. Bet BASHPID saglabās pašreizējo procesa ID, t.i., ja to izsauks iekavās, tas saglabās bērna procesa ID.

Mēs nevaram piešķirt vai modificēt mainīgo $, taču BASHPID var mainīt, taču tam nav ietekmes.

$ $=10
$ BASHPID=10
$ echo $BASHPID

Ir iespējams atiestatīt BASHPID. Pēc atiestatīšanas tas zaudē savu īpašo stāvokli, kā arī jūs varat sākt to izmantot kā parasto mainīgo.

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

Pat ja mēģināt piešķirt čaulas procesa ID, tas tiks uzskatīts par lietotāja definētu mainīgo, jo tas jau ir zaudējis savu īpašo stāvokli.

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

Šajā gadījumā BASHPID ir jāizmanto jauna termināļa sesija, lai iegūtu tā īpašo stāvokli.

Tas ir šis raksts. Šajā rakstā esam redzējuši atšķirību starp $ un BASHPID un kā viņi izturas. Izlasiet šo rakstu un dalieties ar mums savās vērtīgajās atsauksmēs.