Aprenda la diferencia entre $$ y $ Bashpid en Bash
- 1094
- 170
- Mario Gollum
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.
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 $ BashpidEncuentre 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.mierdaProceso 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.mierdaPID 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 BashPá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 $ bashpidAsignació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 $ BASHPIDBashpid 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 $ bashpidReasignando 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.
- « Cómo solucionar la partición NTFS No se pudo montar el error en Linux
- Cómo instalar y configurar el servidor OpenVPN en CentOS 8/7 »