Разница между bash pid и $$ - PullRequest
       3

Разница между bash pid и $$

20 голосов
/ 22 октября 2011

Я новичок в 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) Почему 2-е эхо выводит 0?

3) Является ли $ BASH_SUBSHELL командой или переменной?

4) Я все делаю на Mac, попробую все это на машине с Linux через несколько дней, но всякий раз, когда я запускаю этот скрипт, $BASHPID ничего не возвращает, я просто получаю новую строку. Это потому, что я запускаю это на Mac, а $BASHPID не работает на Mac?

Ответы [ 2 ]

23 голосов
/ 22 октября 2011

Глядя на документацию , это выглядит так:

  1. $$ означает идентификатор процесса, под которым выполняется файл сценария. Для любого данного сценария, когда он выполняется, у него будет только один «основной» идентификатор процесса. Независимо от того, сколько субоболочек вы вызываете, $$ всегда будет возвращать первый идентификатор процесса, связанный со сценарием. BASHPID покажет вам идентификатор процесса текущего экземпляра bash, поэтому в подоболочке он будет отличаться от bash "верхнего уровня", который мог его вызвать.
  2. BASH_SUBSHELL обозначает «уровень подоболочки», на котором вы находитесь. Если вы не находитесь ни на одном уровне подоболочки, ваш уровень равен нулю. Если вы запускаете подоболочку в своей основной программе, этот уровень подоболочки равен 1. Если вы запускаете подоболочку внутри этой подоболочки, уровень будет равен 2 и т. Д.
  3. BASH_SUBSHELL является переменной.
  4. Может быть, BASHPID не поддерживается версией bash, которая у вас есть? Я сомневаюсь, что это проблема "Mac".
6 голосов
/ 22 октября 2011

Было бы лучше познакомиться с 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), вам также потребуется следующее:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...