При выполнении сценария оболочки запускается процесс, называемый подоболочкой. Являясь дочерним процессом основной оболочки, подоболочка выполняет список команд сценария оболочки в пакетном режиме (так называемая "пакетная обработка").
В некоторых случаях необходимо знать идентификатор процесса (PID) под-оболочки, в которой запущен сценарий. Эта информация о PID может быть использована при различных обстоятельствах. Например, можно создать уникальный временный файл в каталоге /tmp, назвав его PID сценария оболочки. В случае если сценарию необходимо просмотреть все запущенные процессы, он может исключить из списка процессов свою собственную оболочку.
В bash PID подпроцесса сценария оболочки хранится в специальной переменной $$. Эта переменная доступна только для чтения, и изменить ее в сценарии оболочки нельзя. Например:
1 2 3 | #!/bin/bash echo "PID этого скрипта: $$" |
Приведенный выше сценарий покажет следующий результат.
Кроме $$, оболочка bash экспортирует еще несколько переменных, доступных только для чтения. Например, PPID хранит идентификатор процесса родительского процесса подоболочки (т.е. основной оболочки). UID хранит идентификатор пользователя, выполняющего скрипт. Например:
1 2 3 4 5 | #!/bin/bash echo "PID этого скрипта: $$" echo "PPID этого скрипта: $PPID" echo "UID этого скрипта: $UID" |
Его вывод будет следующим:
В приведенном примере PID будет меняться при каждом вызове скрипта. Это связано с тем, что при каждом вызове скрипта будет создаваться новая подоболочка. С другой стороны, PPID будет оставаться неизменным до тех пор, пока сценарий выполняется внутри одной и той же оболочки.
Полный список встроенных переменных bash приведен на его man-странице.
1 | man bash |