Aprenda la diferencia entre $$ y $ BASHPID en Bash

Aprenda la diferencia entre $$ y $ BASHPID en Bash

Recientemente estaba 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.

Lectura relacionada. Aprenda la diferencia entre el abastecimiento y la bifurcación en Bash

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 “$ BASHPID” 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 “$ BASHPID” devolverán el mismo valor.

$ echo $$ # Imprimiendo la variable especial $ $ echo $ BASHPID # Imprimiendo el varibale $ BASHPID  Encontrar ID de proceso de Shell actual  Buscar ID de proceso de shell actual Buscar ID de proceso de shell actual

En bash, cuando llamamos a cualquier programa externo desde el shell, se creará un proceso hijo/subshell y el programa se enviará solo en el proceso secundario. Vea el siguiente ejemplo en el que puse 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. De la imagen de abajo, puede entender cuando llamé al script bash crea un proceso secundario y ejecuta el script.

$ ./sample.sh  Proceso secundario de Linux  Proceso secundario de Linux Proceso secundario de Linux freestar.config.enabled_slots.push (LocationName:” tecmint_incontent “, slotId:” tecmint_incontent “);

Ahora usemos tanto” $ “como” $ BASHPID “dentro del script y ver qué devuelve.

#!/Usr/bin/env bash echo” ======================= ===== “ps-ef–forest | grep-i bash echo “============================” echo “PID USANDO $ PARA SCRIPT $ 0 ==> $$” echo “PID USANDO BASHPID PARA SCRIPT $ 0 ==> $ BASHPID” echo

Ahora ejecute el script de nuevo.

$ ./sample.sh  PID del proceso secundario  PID del proceso secundario PID of Child Process

De acuerdo, devuelve el mismo ID de proceso. Aquí viene la diferencia real. Creemos otro proceso hijo dentro del script ejecutando un comando entre paréntesis ().

# ALMACENAMIENTO DEL PID EN UNA VARIABLE… VAR_HASH = $ (echo $$) VAR_BASHPID = $ (echo $ BASHPID) echo “VALOR DE VAR_HASH ==> $ VAR_HASH” echo “VALOR DE VAR_BASHPID ==> $ VAR_BASHPID”  Diferencia en Pid Diferencia en Pid Diferencia en Pid

En bash, Paréntesis. invocará un proceso hijo y ejecutará lo que venga dentro de los paréntesis. En ese caso, tanto $ como $ BASHPID deberían almacenar un nuevo ID de proceso hijo. 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 lo que dice la página de manual.

$ man bash  Página de manual para $  Página de manual para $ Página de manual de $  Página de manual de Bashpid  Página de manual de Bashpid Página de manual para Bashpid

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 puede reasignarse pero no tiene ningún efecto.

$ $ = 10 $ BASHPID = 10 $ echo $ BASHPID Asignación de variable de Bash  Asignación de variable Bash Asignación de variable Bash

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  Desarmar Bashpid  Unset Bashpid Unset Bashpid

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

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

En este caso, debe usar una nueva sesión de terminal para BASHPID. para obtener 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.