$ BASHPID E $$ diferem em alguns casos

6

Estou lendo "BASH pocket guide of Oreilly". Dizia:

The process ID of the current Bash process. In some cases, this can differ from $$.

Acima da explicação, explicada $BASHPID variable.

Pergunta: quais casos?

    
por PersianGulf 23.01.2013 / 05:31

2 respostas

13

Um exemplo é fornecido na descrição BASHPID da página 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 uma subshell que exibe o conteúdo da variável, juntamente com $$ e o conteúdo de BASHPID fora da 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
    
por 23.01.2013 / 05:38
10

Subshells. $$ é especificado por 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

Eu consegui convencer o mantenedor do mksh a adicionar BASHPID à versão mais recente, então é um pouco portável. Também é possível implementar BASHPID em ksh93 em muitas plataformas.

    
por 23.01.2013 / 05:52