Jifunze Tofauti Kati ya $$na $BASHPID katika Bash


Hivi majuzi nilikuwa nikifanya kazi kwenye hati ya ganda na nikaona tofauti kubwa katika jinsi utofauti maalum wa bash $ na BASHPID hufanya. Kila mchakato unaoendeshwa katika Linux utakabidhiwa kitambulisho cha mchakato na hivyo ndivyo mfumo wa uendeshaji unavyoshughulikia mchakato huo.

Vile vile, kikao chako cha terminal cha bash pia kitapewa kitambulisho cha mchakato. Kuna tofauti maalum inayoitwa \$\ na \$BASHPID\ ambayo huhifadhi kitambulisho cha mchakato wa shell ya sasa.

Nenda mbele na endesha amri iliyo hapa chini ili kuona ni nini kitambulisho cha mchakato wa ganda lako la sasa. \$\ na \$BASHPID\ zote mbili zitarejesha thamani sawa.

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

Katika bash tunapoita programu yoyote ya nje kutoka kwa ganda, itaunda mchakato wa mtoto/subshell na programu itawasilishwa katika mchakato wa mtoto pekee. Tazama hapa chini mfano ambapo niliweka amri rahisi ya kufuatilia mchakato kwenye hati inayoitwa sample.sh ili kuonyesha jinsi ganda la mzazi linaunda ganda ndogo ili kuendesha programu.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Sasa kwa kuendesha hati hii tunaweza kupata kitambulisho cha mchakato wa bash. Kutoka kwa picha iliyo hapa chini, unaweza kuelewa nilipoita script bash huunda mchakato wa mtoto na kuendesha hati.

$ ./sample.sh

Sasa hebu tutumie \$\ na \$BASHPID\ zote mbili ndani ya hati na tuone itakavyorejesha.

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

Sasa endesha hati tena.

$ ./sample.sh

Sawa, inarudisha kitambulisho sawa cha mchakato. Hapa inakuja tofauti halisi. Hebu tuunde mchakato mwingine wa mtoto ndani ya hati kwa kutekeleza amri ndani ya parentheses().

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

Kwa bash, Mabano yataomba mchakato wa mtoto na kuendesha chochote kinachoingia kwenye mabano. Katika hali hiyo, $ na $BASHPID zinapaswa kuhifadhi kitambulisho kipya cha mchakato wa mtoto. Lakini kutokana na picha iliyo hapo juu, unaweza kuona kuna tofauti ambapo $ huhifadhi 382 ambayo ni kitambulisho cha mzazi (Kitambulisho cha Mchakato cha script sample.sh), na $BASHPID huhifadhi kitambulisho cha mchakato wa mtoto iliyoundwa na mabano.

Sasa hebu jaribu kuelewa tabia hii. Tutaona kile ukurasa wa mtu unasema.

$ man bash

Unapotumia $, hata katika ganda ndogo, huhifadhi kitambulisho cha mchakato wa mzazi ambacho kiliundwa kutoka. Lakini BASHPID itahifadhi kitambulisho cha mchakato wa sasa, yaani, inapoitwa ndani ya mabano itahifadhi kitambulisho cha mchakato wa mtoto.

Hatuwezi kukabidhi au kurekebisha tofauti $, lakini BASHPID inaweza kukabidhiwa upya lakini haina athari.

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

Inawezekana kufuta BASHPID. Unapoiondoa inapoteza hali yake maalum na pia unaweza kuanza kutumia hii kama kigezo cha kawaida.

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

Hata ukijaribu kupeana kitambulisho cha mchakato wa ganda kitachukuliwa kama kigezo kilichofafanuliwa na mtumiaji kwani tayari kimepoteza hali yake maalum.

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

Katika kesi hii, lazima utumie kikao kipya cha terminal kwa BASHPID kupata hali yake maalum.

Hiyo ni kwa makala hii. Tumeona tofauti kati ya $ na BASHPID na jinsi wanavyofanya kazi katika makala haya. Pitia nakala hii na ushiriki maoni yako muhimu nasi.