Scopri la differenza tra $$e $BASHPID in Bash
Recentemente stavo lavorando su uno script di shell e ho notato una differenza significativa nel comportamento delle variabili speciali bash $
e BASHPID
. A ogni processo in esecuzione in Linux verrà assegnato un ID di processo ed è così che il sistema operativo gestisce il processo.
Allo stesso modo, anche alla sessione del terminale bash verrà assegnato un ID processo. C'è una variabile speciale chiamata "$"
e "$BASHPID"
che memorizza l'ID del processo della shell corrente.
Vai avanti ed esegui il comando seguente per vedere qual è l'ID del processo della tua shell attuale. Sia "$"
che "$BASHPID"
restituiranno lo stesso valore.
echo $$ # Printing special variable $
echo $BASHPID # Printing the varibale $BASHPID
In bash quando chiamiamo qualsiasi programma esterno dalla shell, creerà un processo/sottoshell figlio e il programma verrà inviato solo al processo figlio. Vedi l'esempio seguente in cui ho inserito un semplice comando di monitoraggio del processo in uno script chiamato "sample.sh" per dimostrare come la shell principale crea una subshell per eseguire il programma.
#!/usr/bin/env bash
ps -ef --forest | grep -i bash
Ora eseguendo questo script possiamo ottenere l'ID del processo di bash. Dall'immagine qui sotto, puoi capire quando ho chiamato lo script bash crea un processo figlio ed esegue lo script.
./sample.sh
Ora utilizziamo sia "$"
che "$BASHPID"
all'interno dello script e vediamo cosa restituisce.
#!/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
Ora esegui nuovamente lo script.
./sample.sh
Va bene, restituisce lo stesso ID processo. Ecco la vera differenza. Creiamo un altro processo figlio all'interno dello script eseguendo un comando all'interno di 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"
In bash, Parentheses invocherà un processo figlio ed eseguirà tutto ciò che si trova all'interno delle parentesi. In tal caso, sia $
che $BASHPID
dovrebbero memorizzare un nuovo ID di processo figlio. Ma dall'immagine sopra, puoi vedere che c'è una differenza in cui $
memorizza 382 che è l'ID genitore (ID processo dello script sample.sh) e $BASHPID
memorizza l'ID del processo figlio creato tra parentesi.
Ora proviamo a capire questo comportamento. Vedremo cosa dice la pagina man.
man bash
Quando usi $
, anche in una subshell, memorizza l'ID del processo genitore da cui è stato creato. Ma BASHPID
memorizzerà l'ID del processo corrente, cioè quando chiamato tra parentesi memorizzerà l'ID del processo figlio.
Non possiamo assegnare o modificare la variabile $
, ma BASHPID
può essere riassegnato ma non ha alcun effetto.
$=10
BASHPID=10
echo $BASHPID
È possibile annullare l'impostazione BASHPID. Quando lo disattivi, perde il suo stato speciale e puoi anche iniziare a usarlo come una variabile normale.
unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID
Anche se provi ad assegnare l'ID del processo della shell, questo verrà trattato come una variabile definita dall'utente poiché ha già perso il suo stato speciale.
BASHPID=$(echo $$)
echo $$;echo $BASHPID
In questo caso, devi utilizzare una nuova sessione terminale per BASHPID per ottenere il suo stato speciale.
Per questo articolo è tutto. Abbiamo visto la differenza tra $
e BASHPID
e come si comportano in questo articolo. Leggi questo articolo e condividi con noi il tuo prezioso feedback.