$ BASHPID y $$ difieren en algunos casos

10

Estoy leyendo "BASH guía de bolsillo de Oreilly". Decía:

El ID del proceso del proceso Bash actual. En algunos casos, esto puede diferir de $$.

Por encima de la explicación, explicada $BASHPIDvariable.

Pregunta: ¿ qué casos?

Golfo pérsico
fuente
1
Cabe señalar que $BASHPIDes nuevo en BASH 4. Si está utilizando BASH 3.x, debe usar$$
Bruno Bronosky

Respuestas:

19

Se proporciona un ejemplo en la BASHPIDdescripción de la página de manual de 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.

Aquí hay un ejemplo de una subshell que muestra el contenido de la variable, junto con $$y el contenido BASHPIDexterno de la subshell.

$ 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
fuente
14

Subcapas. $$POSIX especifica y siempre permanece el valor del proceso de shell original. $BASHPIDes una variable específica de Bash y siempre es el valor del proceso desde el que se desreferencia la variable, contando subcapas.

 $ 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

Logré convencer al mantenedor de mksh para agregar BASHPIDa la versión más reciente, por lo que es algo portátil. También es posible implementarlo BASHPIDen ksh93 usted mismo en muchas plataformas.

ormaaj
fuente