Я читаю "BASH карманный справочник Орейли". Он сказал:
Идентификатор процесса текущего процесса Bash. В некоторых случаях это может отличаться от $$.
Выше объяснение, объяснил $BASHPID
переменную.
Вопрос: в каких случаях?
Я читаю "BASH карманный справочник Орейли". Он сказал:
Идентификатор процесса текущего процесса Bash. В некоторых случаях это может отличаться от $$.
Выше объяснение, объяснил $BASHPID
переменную.
Вопрос: в каких случаях?
Ответы:
Пример приведен в 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
Подоболочки. $$
определяется 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
в последнюю версию, так что он несколько переносим. Также можно реализовать BASHPID
ksh93 самостоятельно на многих платформах.
$BASHPID
это новинка для BASH 4. Если вы используете BASH 3.x, вы должны использовать$$