$ BASHPID和$$在某些情况下会有所不同


10

我正在阅读“ Oreilly的BASH袖珍指南”。它说:

当前Bash进程的进程ID。在某些情况下,这可能与$$有所不同。

以上说明,说明了$BASHPID变量。

问题:哪些情况?


1
应当指出,它$BASHPID是BASH 4的新功能。如果您正在使用BASH 3.x,则必须使用$$
Bruno Bronosky,

Answers:


19

BASHPIDbash联机帮助页的描述中提供了一个示例:

   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.

这是一个子shell的示例,它输出变量$$的内容以及BASHPID子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

14

子壳。$$由POSIX指定,并且始终保留原始Shell进程的值。$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到最新版本,因此它有些可移植。也可以BASHPID在许多平台上自己在ksh93中实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.