$$ в скрипте против $$ в подоболочке
$$
дает идентификатор процесса сценария, когда используется в сценарии, например:
Пример 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
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 - это пид 15340
Вопрос: почему так? Разве скрипт не работает в подоболочке? В чем разница между подоболочкой в примере 2 и оболочкой, в которой скрипт запускается в примере 1?
4 ответа
Я попытался и экранирование (для передачи $$ в подоболочку) не работает, так как подоболочка наследует значение $$ от родительского bash. Решением этой проблемы является использование $BASHPID.
(echo $$; echo $BASHPID)
печатает PID из родительской оболочки и из подоболочки.
Из справочной страницы 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.
Замена происходит в родительской оболочке; подоболочка не была запущена к моменту замены.
Более переносимый способ, только для Linux, но также совместимый с Dash:
read -r my_pid _ < /proc/self/stat
echo $my_pid