Búsqueda de sitios web

Aprenda la diferencia entre $$y $BASHPID en Bash


Recientemente estuve trabajando en un script de shell y vi una diferencia significativa en cómo se comportan las variables especiales de bash $ y BASHPID. A cada proceso que se ejecuta en Linux se le asignará un ID de proceso y así es como el sistema operativo maneja el proceso.

De manera similar, a su sesión de terminal bash también se le asignará un ID de proceso. Hay una variable especial llamada "$" y "$BASHPID" que almacena el ID del proceso del shell actual.

Continúe y ejecute el siguiente comando para ver cuál es el ID del proceso de su shell actual. Tanto "$" como "$BASHPID" devolverán el mismo valor.

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

En bash, cuando llamamos a cualquier programa externo desde el shell, se creará un proceso/subshell secundario y el programa se enviará únicamente en el proceso secundario. Vea el siguiente ejemplo donde puse un comando de monitor de proceso simple en un script llamado “sample.sh” para demostrar cómo el shell principal crea un subshell para ejecutar el programa.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Ahora, al ejecutar este script, podemos obtener el ID del proceso de bash. En la imagen a continuación, puede comprender que cuando llamé al script, bash crea un proceso secundario y ejecuta el script.

./sample.sh

Ahora usemos "$" y "$BASHPID" dentro del script y veamos qué devuelve.

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

Ahora ejecute el script nuevamente.

./sample.sh

Muy bien, devuelve el mismo ID de proceso. Aquí viene la diferencia real. Creemos otro proceso hijo dentro del script ejecutando un comando dentro de 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"

En bash, Parentheses invocará un proceso hijo y ejecutará todo lo que esté entre paréntesis. En ese caso, tanto $ como $BASHPID deben almacenar una nueva ID de proceso secundario. Pero en la imagen de arriba, puede ver que hay una diferencia donde $ almacena 382, que es el ID principal (ID de proceso del script sample.sh), y $BASHPID almacena el ID del proceso hijo creado entre paréntesis.

Ahora intentemos comprender este comportamiento. Veremos qué dice la página de manual.

man bash

Cuando usas $, incluso en un subshell, almacena el ID del proceso principal a partir del cual se creó. Pero BASHPID almacenará el ID del proceso actual, es decir, cuando se llame entre paréntesis, almacenará el ID del proceso hijo.

No podemos asignar ni modificar la variable $, pero BASHPID se puede reasignar pero no tiene ningún efecto.

$=10
BASHPID=10
echo $BASHPID

Es posible desarmar BASHPID. Cuando lo desarmas, pierde su estado especial y también puedes comenzar a usarlo como una variable normal.

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

Incluso si intenta asignar el ID de proceso del shell, será tratado como una variable definida por el usuario ya que ya perdió su estado especial.

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

En este caso, debe utilizar una nueva sesión de terminal para que BASHPID obtenga su estado especial.

Eso es todo por este artículo. Hemos visto la diferencia entre $ y BASHPID y cómo se comportan en este artículo. Lea este artículo y comparta sus valiosos comentarios con nosotros.