Ricerca nel sito web

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.