Разница между bash pid и $$
Я начинаю начинать с bash, и у меня есть "домашняя работа". Я понял большую часть материала, но есть часть, в которой говорится, что я должен повторить pid родительского bash и pid двух подоболочек, которые я буду запускать. Поэтому я посмотрел онлайн и нашел это (проект документации Linux):
#!/bin/bash4
echo "\$\$ outside of subshell = $$" # 9602
echo "\$BASH_SUBSHELL outside of subshell = $BASH_SUBSHELL" # 0
echo "\$BASHPID outside of subshell = $BASHPID" # 9602
echo
( echo "\$\$ inside of subshell = $$" # 9602
echo "\$BASH_SUBSHELL inside of subshell = $BASH_SUBSHELL" # 1
echo "\$BASHPID inside of subshell = $BASHPID" ) # 9603
# Note that $$ returns PID of parent process.
Итак, вот мои вопросы:
1) Что делает первый эхо-печать? Является ли это pid родительского bash?
2) Почему вторая эхо-версия выводит 0?
3) Является ли $BASH_SUBSHELL командой или переменной?
4) Я делаю все на Mac, я попробую все это на машине Linux через несколько дней, но
всякий раз, когда я запускаю этот script $BASHPID
, ничего не возвращает, я просто получаю новую строку. Это потому, что я запускаю это на mac и $BASHPID
не работает на mac?
Ответы
Ответ 1
Рассматривая документацию, это выглядит так:
-
$$
означает идентификатор процесса, в котором работает файл script. Для любого заданного script, когда он будет запущен, он будет иметь только один "основной" идентификатор процесса. Независимо от того, сколько подселов вы вызываете, $$
всегда будет возвращать первый идентификатор процесса, связанный с script. BASHPID
покажет вам идентификатор процесса текущего экземпляра bash, поэтому в подоболочке он будет отличаться от "верхнего уровня" bash, который мог вызвать его.
-
BASH_SUBSHELL
указывает "уровень подзаголовка", в котором вы находитесь. Если вы не находитесь на уровне подсечек, ваш уровень равен нулю. Если вы запустите субголовую в своей основной программе, этот уровень подоболочки равен 1. Если вы запустите подоболочку внутри этой подоболочки, уровень будет равен 2 и т.д.
-
BASH_SUBSHELL
- переменная.
- Возможно,
BASHPID
не поддерживается версией bash у вас есть? Я сомневаюсь, что это проблема Mac.
Ответ 2
Лучше всего хорошо познакомиться с bash(1)
:
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.
[...]
BASH_SUBSHELL
Incremented by one each time a subshell or subshell
environment is spawned. The initial value is 0.
$BASHPID
был введен с bash -4.0-alpha. Если вы запустите bash --version
, вы можете узнать, какую версию bash(1)
вы используете.
Если вы собираетесь выполнять большую работу bash(1)
, вам также понадобится следующее: