$ BASHPID Et $$ diffèrent dans certains cas

10

Je lis "BASH pocket guide of Oreilly". Ça disait:

ID de processus du processus Bash en cours. Dans certains cas, cela peut différer de $$.

Explication ci-dessus, $BASHPIDvariable expliquée .

Question: quels cas?

Golfe Persique
la source
1
Il convient de noter que $BASHPIDc'est nouveau pour BASH 4. Si vous utilisez BASH 3.x, vous devez utiliser$$
Bruno Bronosky

Réponses:

19

Un exemple est fourni dans la BASHPIDdescription de la page de manuel bash:

   BASHPID
          Expands to the process id of the  current  bash  process.   This
          differs  from  $$ under certain circumstances, such as subshells
          that do not require bash to be re-initialized.

Voici un exemple de sous-shell qui affiche le contenu de la variable, ainsi que $$le contenu de l' BASHPIDextérieur du sous-shell.

$ echo $(echo $BASHPID $$)      $$       $BASHPID
              25680    16920    16920    16920
#             |        |        |        |
#             |        |        |        -- $BASHPID outside of the subshell
#             |        |        -- $$ outside of the subshell
#             |        -- $$ inside of the subshell
#             -- $BASHPID inside of the subshell
jordanm
la source
14

Sous-coquilles. $$est spécifié par POSIX et reste toujours la valeur du processus shell d'origine. $BASHPIDest une variable spécifique à Bash, et est toujours la valeur du processus à partir duquel la variable est déréférencée, en comptant les sous-coquilles.

 $ f() { printf '%s: %d, %d\n' "$1" $$ $BASHPID; };
 $ ${BASH_VERSION+shopt -s lastpipe}; set +m;
 $ f 1 >&2 | f 2
2: 31490, 31490
1: 31490, 32545

J'ai réussi à convaincre le mainteneur mksh d'ajouter BASHPIDà la version la plus récente, donc c'est un peu portable. Il est également possible de l'implémenter BASHPIDvous-même dans ksh93 sur de nombreuses plateformes.

ormaaj
la source