$ BASHPID и $$ отличаются в некоторых случаях

10

Я читаю "BASH карманный справочник Орейли". Он сказал:

Идентификатор процесса текущего процесса Bash. В некоторых случаях это может отличаться от $$.

Выше объяснение, объяснил $BASHPIDпеременную.

Вопрос: в каких случаях?

Персидский залив
источник
1
Следует отметить, что $BASHPIDэто новинка для BASH 4. Если вы используете BASH 3.x, вы должны использовать$$
Бруно Броноски

Ответы:

19

Пример приведен в BASHPIDописании man-страницы 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.

Вот пример подоболочки, которая выводит содержимое переменной вместе с $$содержимым BASHPIDвне подоболочки.

$ 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
источник
14

Подоболочки. $$определяется POSIX и всегда остается значением исходного процесса оболочки. $BASHPIDявляется специфичной для Bash переменной и всегда является значением процесса, от которого переменная разыменовывается, считая подоболочки.

 $ 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

Мне удалось убедить сопровождающего mksh добавить BASHPIDв последнюю версию, так что он несколько переносим. Также можно реализовать BASHPIDksh93 самостоятельно на многих платформах.

ormaaj
источник