$$ в скрипте против $$ в подоболочке - PullRequest
11 голосов
/ 11 апреля 2011

$$ дает идентификатор процесса процесса сценария при использовании в сценарии, например:

Пример 1

#!/bin/bash
# processid.sh
# print process ids

ps -o cmd,pid,ppid
echo "The value of \$\$ is $$"

$ ./processid.sh 
CMD                           PID  PPID
bash                        15073  4657
/bin/bash ./processid.sh    15326 15073
ps -o cmd,pid,ppid          15327 15326
The value of $$ is 15326

Соблюдайте pid, заданный $$ и ps is 15326

Моя подсказка оболочки pid 15073

Но в подоболочке $$ дает pid родительской оболочки (которая равна 15073)

Пример 2

$ ( ps -o cmd,pid,ppid ; echo $$ )
CMD                           PID  PPID
bash                        15073  4657
bash                        15340 15073
ps -o cmd,pid,ppid          15341 15340
15073

Здесь subshell - это pid 15340

Вопрос: почему так?Разве скрипт не работает в подоболочке?В чем разница между подоболочкой в ​​примере 2 и оболочкой, в которой скрипт запускается в примере 1?

Ответы [ 4 ]

14 голосов
/ 12 апреля 2011

Я пробовал, и экранирование (для передачи $$ в подоболочку) не работает, поскольку подоболочка наследует значение $$ от родительского bash. Решением этой проблемы является использование $ BASHPID.

(echo $$; echo $BASHPID)

печатает PID из родительской оболочки и из подоболочки.

9 голосов
/ 11 апреля 2011

Из справочной страницы bash:

   $      Expands  to  the  process ID of the shell.  In a () subshell, it
          expands to the process ID of the current  shell,  not  the  sub-
          shell.
6 голосов
/ 11 апреля 2011

Замена происходит в родительской оболочке;подоболочка не была запущена к моменту замены.

1 голос
/ 19 ноября 2012

Более портативный способ, только для Linux, но также совместим с Dash:

read -r my_pid _ < /proc/self/stat
echo $my_pid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...