Aprenda la diferencia entre $$ y $ Bashpid en Bash
- 1140
- 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 $ 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.
- « 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 »