Aprenda la diferencia entre 39608 y 39608 en Bash


Recientemente estuve trabajando en un script de shell y vi una diferencia significativa en cómo se comporta la variable especial $ y BASHPID de bash. 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 de bash también se le asignará un ID de proceso. Hay una variable especial llamada y 39700 que almacena el ID de proceso del shell actual.

Continúe y ejecute el siguiente comando para ver cuál es el ID de proceso de su shell actual. Tanto como 39761 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 hijo y el programa se enviará solo en el proceso hijo. Vea el siguiente ejemplo donde coloco un comando de monitor de proceso simple en un script llamado "sample.sh" para demostrar cómo el shell padre 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 de proceso de bash. En la imagen de abajo, puede entender cuando llamé al script bash crea un proceso secundario y ejecuta el script.

$ ./sample.sh

Ahora usemos y 39918 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á lo que venga dentro de los paréntesis. En ese caso, tanto $ como 40103 deberían almacenar un nuevo ID de proceso secundario. Pero en la imagen de arriba, puede ver que hay una diferencia donde $ almacena 382, u200bu200bque es el ID principal (ID de proceso del script sample.sh), y 40103 almacena el ID de proceso hijo creado creado por paréntesis.

Ahora intentemos comprender este comportamiento. Veremos lo que dice la página de manual.

$ man bash

Cuando usa $ , incluso en una subcapa, almacena el ID de proceso del proceso padre desde el que 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 o 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, se tratará como una variable definida por el usuario, ya que ya perdió su estado especial.

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

En este caso, debe usar 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.