$ BASHPID E $$ diferem em alguns casos

10

Estou lendo "Guia de bolso BASH de Oreilly". Dizia:

O ID do processo atual do Bash. Em alguns casos, isso pode ser diferente de $$.

Explicação acima, $BASHPIDvariável explicada .

Pergunta: quais casos?

PersianGulf
fonte
1
Deve-se notar que $BASHPIDé novo para bater 4. Se você estiver usando BASH 3.x, você tem que usar$$
de Bruno Bronosky

Respostas:

19

Um exemplo é fornecido na BASHPIDdescrição da página de manual do 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.

Aqui está um exemplo de um subshell produzindo o conteúdo da variável, junto com $$e o conteúdo de BASHPIDfora do 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
fonte
14

Subshells. $$é especificado pelo POSIX e sempre permanece o valor do processo de shell original. $BASHPIDé uma variável específica do Bash e sempre é o valor do processo a partir do qual a variável é desreferenciada, contando subshells.

 $ 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

Consegui convencer o mantenedor do mksh a adicionar BASHPIDà versão mais recente, por isso é um pouco portátil. Também é possível implementar BASHPIDvocê mesmo no ksh93 em várias plataformas.

ormaaj
fonte