Узнайте разницу между $$и $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
и их поведение. Прочтите эту статью и поделитесь с нами своими ценными отзывами.