$BASHPID와 $$는 경우에 따라 다릅니다.

$BASHPID와 $$는 경우에 따라 다릅니다.

나는 "Orelly의 BASH 포켓 가이드"를 읽고 있습니다. 그것은 말한다:

현재 Bash 프로세스의 프로세스 ID입니다. 어떤 경우에는 $$와 다를 수 있습니다.

위의 설명은 $BASHPID변수를 설명합니다.

질문:어떤 상황인가요?

답변1

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.

다음은 변수의 내용과 $$서브셸 외부의 내용을 인쇄하는 서브셸의 예입니다.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

답변2

서브 쉘. $$POSIX에 의해 지정되며 항상 원래 셸 프로세스의 값을 유지합니다. $BASHPIDBash 관련 변수이며 항상 변수를 역참조한 프로세스의 값입니다(하위 쉘 계산).

 $ 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

BASHPID나는 mksh 관리자에게 이를 최신 버전에 추가하도록 설득했으므로 이식성이 다소 뛰어납니다. 또한 BASHPID많은 플랫폼의 ksh93에서 직접 구현할 수도 있습니다.

관련 정보