Управление окружением и конфигурацией оболочки в Linux

CompTIABeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы изучите основы управления окружением и конфигурацией оболочки в Linux. Вы начнете с создания локальных переменных и переменных окружения, используя такие команды, как echo, export и env, чтобы понять ключевые различия в их области видимости и доступности внутри сеанса оболочки.

Опираясь на этот фундамент, вы исследуете, как переменные и псевдонимы (алиасы) наследуются дочерними оболочками. Вы также научитесь управлять автоматическим экспортом переменных с помощью опции set -o allexport и узнаете, как сделать ваши пользовательские конфигурации постоянными между сеансами, редактируя файл .bashrc.

Создание и различие локальных переменных и переменных окружения

На этом этапе вы научитесь создавать переменные оболочки и управлять ими. В оболочках Linux, таких как Zsh, переменные используются для хранения информации. Существует два основных типа: локальные переменные и переменные окружения.

  • Локальная переменная (или переменная оболочки) доступна только внутри той оболочки, в которой она была создана.
  • Переменная окружения доступна не только в текущей оболочке, но и в любых дочерних процессах, запущенных из этой оболочки.

Для работы с ними мы будем использовать команды echo, export и env. Все команды будут выполняться в терминале.

Сначала создадим локальную переменную. В терминале, который уже находится в каталоге ~/project, введите следующую команду, чтобы создать переменную с именем flower и присвоить ей значение rose. Обратите внимание, что вокруг знака равенства (=) не должно быть пробелов.

flower=rose

Чтобы убедиться, что переменная создана, можно использовать команду echo для вывода ее значения. Знак доллара ($) перед именем переменной указывает оболочке подставить вместо имени значение этой переменной.

echo $flower

Вы должны увидеть значение переменной, выведенное в терминале:

rose

Теперь проверим, является ли эта локальная переменная частью окружения оболочки. Команда env выводит список всех переменных окружения. Мы можем перенаправить ее вывод команде grep, чтобы найти нашу переменную.

env | grep flower

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

Далее создадим переменную окружения. Процесс аналогичен, но мы используем команду export. Эта команда создает переменную и помечает ее для передачи всем дочерним процессам текущей оболочки. Создадим переменную окружения с именем nut и значением almond.

export nut=almond

Проверим ее с помощью echo, как и раньше.

echo $nut

Команда выведет значение переменной nut:

almond

Теперь снова проверим ее наличие в окружении с помощью команды env.

env | grep nut

На этот раз команда найдет и отобразит переменную, подтверждая, что nut является переменной окружения:

nut=almond

Вы успешно создали локальную переменную и переменную окружения и увидели фундаментальную разницу в том, как они обрабатываются окружением оболочки. Мы оставим эти переменные установленными для использования на следующих этапах.

Тестирование наследования переменных и псевдонимов в дочерней оболочке

На этом этапе вы исследуете, как ведут себя переменные и псевдонимы (алиасы) при запуске новой оболочки из текущей. Эта новая оболочка называется «дочерней оболочкой» (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

Ничего не будет возвращено.

Это упражнение продемонстрировало вам ключевой принцип работы оболочки: переменные окружения наследуются дочерними процессами, а локальные переменные и псевдонимы — нет.

Управление автоматическим экспортом переменных с помощью set -o allexport

На этом этапе вы узнаете о мощной опции оболочки под названием allexport. Обычно при создании переменной вы должны явно использовать команду export, чтобы сделать ее переменной окружения. Однако, включив опцию allexport, вы можете приказать оболочке автоматически экспортировать каждую новую определяемую вами переменную. Это может быть удобным сокращением, особенно в скриптах, где все переменные должны быть доступны подпроцессам.

Опции оболочки — это внутренние настройки, которые изменяют поведение вашей оболочки. Вы можете включить их с помощью set -o [имя_опции] и выключить с помощью set +o [имя_опции].

Сначала проверим текущий статус опции allexport. Вы можете вывести список всех опций оболочки и отфильтровать allexport с помощью grep.

set -o | grep allexport

По умолчанию эта опция выключена. Вывод покажет ее статус как off:

allexport              off

Теперь включим опцию allexport.

set -o allexport

Убедитесь, что настройка изменилась, снова запустив команду проверки.

set -o | grep allexport

На этот раз вывод подтвердит, что опция включена (on):

allexport              on

При включенной опции allexport любая создаваемая вами переменная автоматически становится переменной окружения. Проверим это. Создайте новую переменную с именем truck без использования команды export.

truck=chevy

Теперь проверьте, существует ли truck в окружении, используя команду env.

env | grep truck

Вы увидите, что переменная truck присутствует в списке, хотя вы не использовали export. Это произошло потому, что была активна опция allexport.

truck=chevy

Эта функция может быть очень полезной, но рекомендуется отключать ее, когда она больше не нужна, чтобы избежать непреднамеренного экспорта переменных. Давайте выключим allexport.

set +o allexport

Наконец, убедитесь, что она была выключена.

set -o | grep allexport

Вывод снова покажет, что опция находится в состоянии off.

allexport              off

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

Сохранение настроек оболочки с помощью файла .bashrc

На этом этапе вы узнаете, как сделать настройки вашей оболочки постоянными. Любые псевдонимы, функции или опции оболочки, которые вы устанавливаете, являются временными и будут потеряны при закрытии сеанса терминала. Чтобы сохранить их навсегда, необходимо добавить их в конфигурационный файл оболочки.

Хотя в заголовке упоминается .bashrc (конфигурационный файл для оболочки Bash), в нашей лабораторной среде используется оболочка Zsh. Эквивалентным конфигурационным файлом для Zsh является ~/.zshrc. Этот файл представляет собой скрипт, который запускается автоматически каждый раз при открытии новой интерактивной оболочки, что делает его идеальным местом для хранения ваших персональных настроек.

Мы попрактикуемся в этом, сделав опцию оболочки noclobber постоянной. Опция noclobber предотвращает случайную перезапись существующего файла при использовании перенаправления вывода (>).

Сначала воспользуемся текстовым редактором nano, чтобы добавить опцию noclobber в ваш файл ~/.zshrc. Символ ~ является сокращением для вашего домашнего каталога /home/labex.

nano ~/.zshrc

Эта команда открывает файл ~/.zshrc в редакторе nano. Используйте клавиши со стрелками, чтобы переместить курсор в самый конец файла, и добавьте следующую строку:

set -o noclobber

Теперь сохраните файл и выйдете из nano. Для этого нажмите Ctrl+O (Write Out), нажмите Enter для подтверждения имени файла, а затем нажмите Ctrl+X для выхода.

Вы снова вернулись к командной строке. Проверим, активна ли опция noclobber в вашей текущей оболочке.

set -o | grep noclobber

Вывод будет таким:

noclobber              off

Почему она выключена? Потому что ваш текущий сеанс оболочки еще не прочитал изменения, которые вы только что внесли в файл ~/.zshrc. Файл считывается только при запуске новой оболочки.

Чтобы доказать это, запустим новую дочернюю оболочку.

zsh

Теперь вы в новой оболочке. Проверим статус noclobber здесь.

set -o | grep noclobber

На этот раз вывод будет:

noclobber              on

Это подтверждает, что новые оболочки корректно считывают файл ~/.zshrc и применяют настройки. Теперь выйдите из дочерней оболочки, чтобы вернуться в исходную родительскую оболочку.

exit

Как же применить изменения к текущей оболочке, не закрывая и не открывая ее заново? Вы можете использовать команду source, которая считывает и выполняет команды из файла в контексте текущей оболочки.

source ~/.zshrc

Команда source теперь выполнила строку set -o noclobber из вашего конфигурационного файла. Убедимся, что noclobber теперь включен в нашей исходной оболочке.

set -o | grep noclobber

Теперь вывод будет:

noclobber              on

Вы успешно научились сохранять настройки оболочки путем редактирования файла ~/.zshrc и применять эти изменения к текущему сеансу с помощью команды source.

Резюме

В этой лабораторной работе вы изучили фундаментальные концепции управления окружением оболочки Linux. Вы попрактиковались в создании как локальных переменных, ограниченных текущей оболочкой, так и переменных окружения, которые наследуются любыми дочерними процессами. Были использованы такие ключевые команды, как echo для отображения значений переменных, export для создания переменных окружения и env для их вывода в виде списка. Концепция наследования была дополнительно изучена путем запуска дочерней оболочки для проверки того, какие переменные и псевдонимы были успешно переданы из родительской оболочки.

Кроме того, вы изучили методы управления и сохранения конфигурации вашей оболочки. Вы использовали опцию set -o allexport для автоматического экспорта всех последующих определенных переменных, упрощая процесс их предоставления дочерним процессам. Чтобы гарантировать доступность ваших пользовательских переменных, псевдонимов и опций оболочки во всех будущих сеансах терминала, вы научились добавлять эти конфигурации в файл автозагрузки .bashrc (или .zshrc), делая настройки вашего окружения постоянными.