Тестирование наследования переменных и псевдонимов в дочерней оболочке
На этом этапе вы исследуете, как ведут себя переменные и псевдонимы (алиасы) при запуске новой оболочки из текущей. Эта новая оболочка называется «дочерней оболочкой» (child shell), а исходная — «родительской оболочкой» (parent shell). Эта концепция крайне важна для понимания структуры окружения оболочки и выполнения скриптов. Мы проверим, передаются ли переменные flower и nut из предыдущего шага «по наследству» дочерней оболочке.
Сначала определим идентификатор процесса (PID) нашей текущей родительской оболочки. Каждый процесс в Linux имеет уникальный PID. Его можно просмотреть с помощью команды echo $$.
echo $$
Результатом будет число — PID вашей текущей оболочки. Например:
123
Теперь запустите дочернюю оболочку, просто введя zsh и нажав Enter. Это создаст новый процесс оболочки внутри текущего.
zsh
Теперь вы находитесь в новом сеансе оболочки. Чтобы подтвердить это, можно использовать команду ps -f, которая показывает подробную информацию о процессах, включая идентификатор родительского процесса (PPID).
ps -f
Посмотрите на вывод. Вы увидите два процесса zsh. PID нового процесса zsh должен иметь PPID, соответствующий PID родительской оболочки, который вы записали ранее.
UID PID PPID C STIME TTY TIME CMD
labex 123 1 0 10:00 pts/0 00:00:00 zsh
labex 456 123 0 10:01 pts/0 00:00:00 zsh
labex 457 456 0 10:01 pts/0 00:00:00 ps -f
В этом примере новая оболочка (PID 456) является дочерней по отношению к исходной оболочке (PPID 123).
Теперь проверим переменные. В этой дочерней оболочке попробуйте вывести значение локальной переменной flower.
echo $flower
Команда не выдает никакого результата. Это происходит потому, что локальные переменные ограничены оболочкой, в которой они были созданы, и не наследуются дочерними оболочками.
Затем проверьте переменную окружения nut.
echo $nut
На этот раз оболочка выведет значение переменной:
almond
Это доказывает, что переменные окружения, в отличие от локальных переменных, наследуются дочерними оболочками.
Теперь вернемся в родительскую оболочку с помощью команды exit.
exit
Вы снова в исходной оболочке. Проведем аналогичный тест с псевдонимом (alias). Псевдоним — это сокращение для команды. Создайте псевдоним с именем ldetc, который выполняет команду ls -ld /etc.
alias ldetc='ls -ld /etc'
Убедитесь, что псевдоним создан, введя команду alias.
alias ldetc
Вы должны увидеть определение вашего псевдонима:
ldetc='ls -ld /etc'
Теперь протестируйте псевдоним, запустив его.
ldetc
Команда выполнит ls -ld /etc и покажет сведения о каталоге /etc.
drwxr-xr-x 1 root root 4096 Oct 10 10:00 /etc
Теперь откройте еще одну дочернюю оболочку, чтобы проверить, наследуется ли псевдоним.
zsh
Внутри новой дочерней оболочки попробуйте использовать псевдоним ldetc.
ldetc
Вы получите сообщение об ошибке, так как псевдонимы, как и локальные переменные, не наследуются дочерними оболочками.
zsh: command not found: ldetc
Вернитесь в родительскую оболочку.
exit
Наконец, наведем порядок, удалив псевдоним из родительской оболочки с помощью команды unalias.
unalias ldetc
Убедитесь в его удалении, попытавшись снова вывести его список.
alias ldetc
Ничего не будет возвращено.
Это упражнение продемонстрировало вам ключевой принцип работы оболочки: переменные окружения наследуются дочерними процессами, а локальные переменные и псевдонимы — нет.