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.