Zoeken op website

Leer het verschil tussen $$en $BASHPID in Bash


Onlangs werkte ik aan een shellscript en ik zag een aanzienlijk verschil in hoe de speciale bash-variabele $ en BASHPID zich gedraagt. Elk proces dat onder Linux draait, krijgt een proces-ID toegewezen en dat is hoe het besturingssysteem het proces afhandelt.

Op dezelfde manier wordt aan uw bash-terminalsessie ook een proces-ID toegewezen. Er is een speciale variabele genaamd "$" en "$BASHPID" die de proces-ID van de huidige shell opslaat.

Ga je gang en voer de onderstaande opdracht uit om te zien wat de proces-ID is van je huidige shell. Zowel "$" als "$BASHPID" retourneren dezelfde waarde.

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

Als we in bash een extern programma vanuit de shell aanroepen, wordt er een onderliggend proces/subshell gemaakt en wordt het programma alleen in het onderliggende proces ingediend. Zie het onderstaande voorbeeld waarin ik een eenvoudig procesmonitorcommando in een script met de naam “sample.sh” plaats om te demonstreren hoe de bovenliggende shell een subshell creëert om het programma uit te voeren.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Bij het uitvoeren van dit script kunnen we nu de proces-ID van bash verkrijgen. Uit de onderstaande afbeelding kunt u begrijpen wanneer ik het script heb aangeroepen, bash een onderliggend proces maakt en het script uitvoert.

./sample.sh

Laten we nu zowel "$" als "$BASHPID" in het script gebruiken en kijken wat het retourneert.

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

Voer het script nu opnieuw uit.

./sample.sh

Oké, het retourneert dezelfde proces-ID. Hier komt het werkelijke verschil. Laten we nog een onderliggend proces in het script maken door een opdracht tussen haakjes() uit te voeren.

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"

In bash zal Haakjes een onderliggend proces aanroepen en alles uitvoeren wat tussen de haakjes staat. In dat geval moeten zowel $ als $BASHPID een nieuw onderliggend proces-ID opslaan. Maar uit de bovenstaande afbeelding kun je zien dat er een verschil is waarbij $ 382 opslaat, wat de bovenliggende ID is (proces-ID van het script sample.sh), en $BASHPID slaat de aangemaakte onderliggende proces-ID op, gemaakt tussen haakjes.

Laten we nu proberen dit gedrag te begrijpen. We zullen zien wat de manpagina zegt.

man bash

Wanneer u $ gebruikt, zelfs in een subshell, slaat het de proces-ID op van het bovenliggende proces waaruit het is gemaakt. Maar BASHPID slaat het huidige proces-ID op, dat wil zeggen dat wanneer het tussen haakjes wordt aangeroepen, het onderliggende proces-ID wordt opgeslagen.

We kunnen de variabele $ niet toewijzen of wijzigen, maar BASHPID kan opnieuw worden toegewezen, maar dit heeft geen effect.

$=10
BASHPID=10
echo $BASHPID

Het is mogelijk om BASHPID uit te schakelen. Wanneer u deze uitschakelt, verliest deze zijn speciale status en kunt u deze ook als een normale variabele gaan gebruiken.

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

Zelfs als u probeert de proces-ID van de shell toe te wijzen, wordt deze behandeld als een door de gebruiker gedefinieerde variabele, omdat deze zijn speciale status al heeft verloren.

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

In dit geval moet u een nieuwe terminalsessie gebruiken om BASHPID de speciale status te geven.

Dat is het voor dit artikel. We hebben in dit artikel het verschil gezien tussen $ en BASHPID en hoe ze zich gedragen. Neem dit artikel door en deel uw waardevolle feedback met ons.