Подтвердить что ты не робот

Разница между 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?

4b9b3361

Ответ 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), вам также понадобится следующее: