Recherche de site Web

Apprenez la différence entre $$et $BASHPID dans Bash


Récemment, je travaillais sur un script shell et j'ai constaté une différence significative dans le comportement des variables spéciales bash $ et BASHPID. Chaque processus exécuté sous Linux se verra attribuer un ID de processus et c'est ainsi que le système d'exploitation gère le processus.

De même, votre session de terminal bash se verra également attribuer un ID de processus. Il existe une variable spéciale appelée "$" et "$BASHPID" qui stocke l'ID de processus du shell actuel.

Allez-y et exécutez la commande ci-dessous pour voir quel est l’ID de processus de votre shell actuel. "$" et "$BASHPID" vont renvoyer la même valeur.

echo $$               # Printing special variable $
echo $BASHPID         # Printing the varibale $BASHPID

Dans bash, lorsque nous appelons un programme externe depuis le shell, il créera un processus/sous-shell enfant et le programme sera soumis uniquement dans le processus enfant. Voir l'exemple ci-dessous où j'ai mis une simple commande de moniteur de processus dans un script appelé « sample.sh » pour montrer comment le shell parent crée un sous-shell pour exécuter le programme.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Maintenant, en exécutant ce script, nous pouvons obtenir l'ID de processus de bash. À partir de l'image ci-dessous, vous pouvez comprendre quand j'ai appelé le script, bash crée un processus enfant et exécute le script.

./sample.sh

Utilisons maintenant à la fois "$" et "$BASHPID" dans le script et voyons ce qu'il renvoie.

#!/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

Maintenant, exécutez à nouveau le script.

./sample.sh

Très bien, il renvoie le même identifiant de processus. Voici la vraie différence. Créons un autre processus enfant dans le script en exécutant une commande dans parenthèses().

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"

Dans bash, Parenthèses invoquera un processus enfant et exécutera tout ce qui se trouve entre parenthèses. Dans ce cas, $ et $BASHPID doivent stocker un nouvel ID de processus enfant. Mais à partir de l'image ci-dessus, vous pouvez voir qu'il y a une différence où $ stocke 382 qui est l'ID parent (ID de processus du script sample.sh), et $BASHPID stocke l'ID du processus enfant créé par des parenthèses.

Essayons maintenant de comprendre ce comportement. Nous verrons ce que dit la page de manuel.

man bash

Lorsque vous utilisez $, même dans un sous-shell, il stocke l'ID de processus du processus parent à partir duquel il a été créé. Mais BASHPID stockera l'ID du processus actuel, c'est-à-dire que lorsqu'il est appelé entre parenthèses, il stockera l'ID du processus enfant.

Nous ne pouvons pas attribuer ou modifier la variable $, mais BASHPID peut être réaffecté mais cela n'a aucun effet.

$=10
BASHPID=10
echo $BASHPID

Il est possible de désactiver BASHPID. Lorsque vous le désactivez, il perd son état spécial et vous pouvez également commencer à l'utiliser comme variable normale.

unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID

Même si vous essayez d'attribuer l'ID de processus du shell, il sera traité comme une variable définie par l'utilisateur puisqu'il a déjà perdu son état spécial.

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

Dans ce cas, vous devez utiliser une nouvelle session de terminal pour BASHPID pour obtenir son état spécial.

C'est tout pour cet article. Nous avons vu la différence entre $ et BASHPID et comment ils se comportent dans cet article. Parcourez cet article et partagez vos précieux commentaires avec nous.