Поиск по сайту:

Узнайте разницу между $$и $BASHPID в Bash


Недавно я работал над сценарием оболочки и увидел значительную разницу в поведении специальных переменных bash $ и BASHPID. Каждому процессу, работающему в Linux, будет присвоен ID процесс, и именно так операционная система обрабатывает этот процесс.

Аналогично, вашему сеансу терминала bash также будет присвоен идентификатор процесса. Существует специальная переменная "$" и "$BASHPID", в которой хранится идентификатор процесса текущей оболочки.

Продолжайте и выполните приведенную ниже команду, чтобы узнать идентификатор процесса вашей текущей оболочки. И "$", и "$BASHPID" будут возвращать одно и то же значение.

echo $$               # Printing special variable $
echo $BASHPID         # Printing the varibale $BASHPID

В bash, когда мы вызываем любую внешнюю программу из оболочки, она создает дочерний процесс/подоболочку, и программа будет отправлена только в дочерний процесс. См. пример ниже, где я поместил простую команду монитора процесса в сценарий под названием "sample.sh", чтобы продемонстрировать, как родительская оболочка создает подоболочку для запуска программы.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Теперь, запустив этот скрипт, мы можем получить идентификатор процесса bash. Из изображения ниже вы можете понять, что когда я вызвал скрипт, bash создает дочерний процесс и запускает скрипт.

./sample.sh

Теперь давайте используем как "$", так и "$BASHPID" внутри скрипта и посмотрим, что он вернет.

#!/usr/bin/env bash
echo "============================"
ps -ef --forest | grep -i bash
echo "============================"
echo "PID USING $ FOR SCRIPT $0 ==> $$"
echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID"
echo

Теперь запустите скрипт еще раз.

./sample.sh

Хорошо, он возвращает тот же идентификатор процесса. Вот и настоящая разница. Давайте создадим еще один дочерний процесс внутри скрипта, выполнив команду внутри parentheses().

STORING THE PID INTO A VARIABLE…

VAR_HASH=$(echo $$)
VAR_BASHPID=$(echo $BASHPID)

echo "VALUE OF VAR_HASH ==> $VAR_HASH"
echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"

В bash Круглые скобки вызовет дочерний процесс и запустит все, что находится внутри круглых скобок. В этом случае и $, и $BASHPID должны хранить новый идентификатор дочернего процесса. Но на изображении выше вы можете видеть разницу: $ хранит 382, который является родительским идентификатором (идентификатором процесса сценария sample.sh ). ), а $BASHPID хранит идентификатор созданного дочернего процесса, заключенный в круглые скобки.

Теперь попробуем понять это поведение. Посмотрим, что говорит справочная страница.

man bash

Когда вы используете $, даже в подоболочке, он сохраняет идентификатор родительского процесса, из которого он был создан. Но BASHPID будет хранить текущий идентификатор процесса, т. е. при вызове внутри круглых скобок он будет хранить идентификатор дочернего процесса.

Мы не можем назначить или изменить переменную $, но BASHPID можно переназначить, но это не даст никакого эффекта.

$=10
BASHPID=10
echo $BASHPID

BASHPID можно отключить. Когда вы снимаете настройку, она теряет свое особое состояние, и вы также можете начать использовать ее как обычную переменную.

unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID

Даже если вы попытаетесь присвоить идентификатор процесса оболочки, он будет рассматриваться как определяемая пользователем переменная, поскольку он уже потерял свое особое состояние.

BASHPID=$(echo $$)
echo $$;echo $BASHPID

В этом случае вам придется использовать новый сеанс терминала для BASHPID, чтобы получить его особое состояние.

Вот и все, что касается этой статьи. В этой статье мы увидели разницу между $ и BASHPID и их поведение. Прочтите эту статью и поделитесь с нами своими ценными отзывами.