Lær forskellen mellem 2784369 og i Bash


For nylig arbejdede jeg på et shell-script, og jeg så en signifikant forskel i, hvordan bash-specialvariablen $ og BASHPID opfører sig. Hver proces, der kører i Linux, tildeles et proces-id, og det er sådan, operativsystemet håndterer processen.

På samme måde tildeles din bash-terminalsession også et proces-id. Der er en speciel variabel kaldet $ og , der gemmer proces-id'et for den aktuelle shell.

Gå videre og kør kommandoen nedenfor for at se, hvad der er proces-id'et for din nuværende skal. Både $ og vil returnere den samme værdi.

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

I bash når vi kalder et eksternt program fra shell, opretter det en underordnet proces/subshell, og programmet vil kun blive indsendt i underprocessen. Se eksemplet nedenfor, hvor jeg lægger en simpel procesmonitorkommando i et script kaldet "sample.sh" for at demonstrere, hvordan den overordnede shell opretter en subshell til at køre programmet.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Nu når vi kører dette script, kan vi få proces-id'et til bash. Fra nedenstående billede kan du forstå, hvornår jeg ringede til script bash opretter en underordnet proces og kører scriptet.

$ ./sample.sh

Lad os nu bruge både $ og inde i scriptet og se, hvad det returnerer.

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

Kør nu scriptet igen.

$ ./sample.sh

Okay, det returnerer det samme proces-id. Her kommer den faktiske forskel. Lad os oprette en ny underordnet proces inde i scriptet ved at køre en kommando inden for parenteser () .

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

I bash vil Parentheses påkalde en underordnet proces og køre det, der kommer inden for parenteserne. I så fald skal både $ og gemme et nyt underordnet proces-id. Men fra ovenstående billede kan du se, at der er en forskel, hvor $ gemmer 382, som er det overordnede id (proces-id for scriptet sample.sh), og gemmer oprettet underordnet proces-ID oprettet med parenteser.

Lad os nu prøve at forstå denne adfærd. Vi vil se, hvad mandsiden siger.

$ man bash

Når du bruger $ , selv i en subshell, gemmer den proces-id'et for den overordnede proces, den blev oprettet fra. Men BASHPID gemmer det aktuelle proces-id, dvs. når det kaldes inden for parenteser, gemmer det underordnede proces-id.

Vi kan ikke tildele eller ændre variablen $ , men BASHPID kan tildeles igen, men det har ingen effekt.

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

Det er muligt at frakoble BASHPID. Når du frakobler det, mister det sin specielle tilstand, og du kan også begynde at bruge dette som en normal variabel.

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

Selv hvis du prøver at tildele shellens proces-id, behandles det som en brugerdefineret variabel, da det allerede mistede sin specielle tilstand.

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

I dette tilfælde skal du bruge en ny terminalsession til BASHPID for at få sin specielle tilstand.

Det er det for denne artikel. Vi har set forskellen mellem $ og BASHPID og hvordan de opfører sig i denne artikel. Gå igennem denne artikel og del din værdifulde feedback med os.