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 Bash Variable especial ps y Bashpid comportamiento. Cada proceso que se ejecuta en Linux se asignará con un proceso IDENTIFICACIÓN y así es como el sistema operativo maneja el proceso.

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

Del mismo modo, su sesión de terminal de bash también se asignará con una identificación de proceso. Hay una variable especial llamada ps y "$ Bashpid" que almacena la identificación del proceso del shell actual.

Continúe y ejecute el siguiente comando para ver cuál es la identificación de proceso de su shell actual. Ambos ps y "$ Bashpid" va a devolver el mismo valor.

$ Echo $$ # Impresión Variable especial $ $ Echo $ Bashpid # Impresión The Varibale $ Bashpid 
Encuentre la identificación del proceso de shell actual

En bash, cuando llamemos a cualquier programa externo desde el shell, creará un proceso/subshell infantil y el programa se enviará solo en el proceso infantil. Vea el siguiente ejemplo donde pongo un comando simple de monitor de proceso en un script llamado "muestra.mierda Para demostrar cómo el shell principal crea una subshell para ejecutar el programa.

#!/usr/bin/env Bash PS -ef --forest | Grep -i Bash 

Ahora al ejecutar este script podemos obtener la identificación del proceso de Bash. De la imagen a continuación, puede entender cuando llamé a la fiesta de script crea un proceso infantil y ejecuta el script.

ps ./muestra.mierda 
Proceso de niños de Linux

Ahora usemos ambos ps y "$ Bashpid" dentro del guión y ver lo que regresa.

#!/usr/bin/env Bash echo "=============================" PS -ef --forest | grep -i bash echo "============================" echo "PID USING $ FOR SCRIPT $0 ==> $$" echo "Pid usando Bashpid para script $ 0 ==> $ Bashpid" Echo 

Ahora ejecuta el guión de nuevo.

ps ./muestra.mierda 
PID del proceso infantil

Muy bien, devuelve la misma identificación de proceso. Aquí viene la diferencia real. Creemos otro proceso infantil dentro del script ejecutando un comando en el interior paréntesis ().

# Almacenar el 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

En Bash, Paréntesis Invocará un proceso infantil y ejecutará lo que venga dentro de los paréntesis. En ese caso, ambos ps y $ Bashpid debe almacenar una nueva identificación de proceso infantil. Pero de la imagen de arriba, puede ver que hay una diferencia donde ps historias 382 cuál es la identificación principal (ID de proceso del script muestra.mierda), y $ Bashpid almacena la identificación del proceso infantil creado creado por paréntesis.

Ahora intentemos entender este comportamiento. Veremos lo que dice la página del hombre.

$ hombre Bash 
Página del hombre por $ Página del hombre para Bashpid

Cuando usas ps, Incluso en una subshell, almacena la identificación del proceso del proceso principal del que se creó desde. Pero Bashpid almacenaré la identificación del proceso actual, yo.e Cuando se llame a los paréntesis dentro de la identificación del proceso del niño.

No podemos asignar o modificar la variable ps, pero Bashpid se puede reasignar pero no tiene ningún efecto.

$ $ = 10 $ bashpid = 10 $ echo $ bashpid 
Asignación de variables bash

Es posible desastar Bashpid. Cuando se desanimará, pierde su estado especial y también puede comenzar a usar esto como una variable normal.

$ Unset Bashpid $ ECHO $ ​​BASHPID $ BASHPID = "TECMINT" $ ECHO $ ​​BASHPID 
Bashpid unset

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 
Reasignando Bashpid

En este caso, debe usar una nueva sesión de terminal para Bashpid Para obtener su estado especial.

Eso es todo para este artículo. Hemos visto la diferencia entre ps y Bashpid y cómo se comportan en este artículo. Revise este artículo y comparta sus valiosos comentarios con nosotros.