Большинство представителей ИТ-сообщества предпочитают взаимодействовать с системами через интерфейс командной строки (CMD) или оболочку (shell). Как правило, это облегчает их работу. Например, вы можете создать команду оболочки, которая будет автоматически выполнять несколько задач, вместо того чтобы кликать по нескольким кнопкам графического интерфейса (GUI).
При запуске оболочки или программы CMD она собирает воедино несколько фрагментов информации. Эта информация определяет, как программа обращается к базовым системным ресурсам, а также ее общее поведение. Вы можете хранить ее в месте, называемом окружением (средой). Окружение состоит из строк, представляющих собой пары «ключ-значение». В этом руководстве мы будем использовать Ubuntu 20.04 VPS в качестве примера, который поможет вам при настройке переменных окружения или оболочки. Данное руководство должно быть применимо и к другим дистрибутивам Linux.
В чем разница между переменными окружения и переменными оболочки?
При запуске сессии информация собирается из настроек системы и конфигурационных файлов. Затем она становится доступной процессу оболочки и его дочерним процессам. Эта информация представляет собой набор пар «ключ-значение» в следующем формате:
|
1 2 3 |
KEY=value KEY="Some value" KEY=data1:data2 |
Имена переменных, то есть ключи, чувствительны к регистру. Однако традиционно принято записывать их в ВЕРХНЕМ РЕГИСТРЕ. Это помогает отличать их в других контекстах. С помощью символа двоеточия ‘:’ вы можете назначить несколько значений одной и той же переменной. Также важно следить за тем, чтобы не оставлять пробелов вокруг знака =. Ключи являются переменными и делятся на два типа: переменные окружения и переменные оболочки. Переменные окружения содержат все переменные, определенные на уровне системы и доступные для всех дочерних оболочек или процессов. Они помогают передавать информацию в процессы, которые вы запускаете с помощью команд оболочки. Переменные оболочки включают только те переменные, которые определены в конкретной сессии оболочки. Кроме того, они включают только те переменные, которые доступны исключительно внутри данного экземпляра оболочки.
Вывод списка переменных окружения и оболочки
По умолчанию терминал предоставляет две команды для вывода списка переменных окружения и оболочки: env или printenv. В своем состоянии по умолчанию они показывают одну и ту же информацию. Вот пример вывода этих команд:
Использование env:

Использование printenv:

Как видите, вывод одинаков. Разница возникает тогда, когда вам нужно получить значение определенного ключа. Именно тогда вы будете использовать printenv с именем переменной:

Чтобы увидеть несколько значений, вы можете передать команде printenv более одного аргумента. Значения появятся в том порядке, в котором вы ввели аргументы:

Вы также можете использовать команду echo с именем переменной для отображения значения переменной:

Команда env позволяет изменять окружение, в котором запускаются программы, передавая определения переменных в следующем синтаксисе:
|
1 |
env VAR1="var 1 value" command_to_run command_options |
Это позволяет переопределять значения или устанавливать новые значения, которые могут использоваться дочерним процессом. Команды printenv и env выводят список переменных окружения, как показано выше. Они уже были определены для системных процессов. Если вы хотите увидеть список переменных оболочки, вы можете использовать команду set. Ввод команды set без каких-либо переменных вернет список всех переменных окружения, переменных оболочки, локальных переменных и функций оболочки:

Переменных может быть слишком много. При необходимости вы можете разбивать их вывод на страницы с помощью команды:
|
1 |
set | less |
Вы можете дополнительно очистить вывод, указав выполнение команды set в режиме POSIX, чтобы не выводить функции оболочки. Здесь мы выполняем команду в подоболочке (отдельном экземпляре командного процессора), чтобы предотвратить изменение текущего окружения этой командой:
|
1 |
(set -o posix; set) |
Выше перечислены все переменные окружения и оболочки, доступные в системе. Вы можете сократить вывод с помощью следующей команды, чтобы попытаться получить только переменные оболочки:
|
1 |
comm -23 <(set -o posix; set | sort) <(env | sort) |
Пример вывода вышеуказанной команды:

Хотя команда может включать несколько переменных окружения, она поможет вам отличить переменные оболочки от переменных окружения. Это связано с тем, что команда set заключает значения переменных в кавычки, в то время как команды printenv и env этого не делают. Переменные оболочки полезны для установки постоянных значений для сессий без постоянной записи изменений в файлы.
Общие переменные окружения
USER – текущий вошедший в систему пользователь.
SHELL – оболочка, которая будет интерпретировать вводимые вами команды. По умолчанию используется bash, но вы можете это изменить.
HOME – домашний каталог текущего пользователя.
TERM – указывает тип эмулируемого терминала. Показывает текущий эмулируемый терминал.
PWD – текущий рабочий каталог.
OLDPWD – предыдущий рабочий каталог. Это помогает оболочке переключиться на предыдущий каталог при вводе команды смены каталога cd.
EDITOR – текстовый редактор по умолчанию при вводе edit в терминале.
LS_COLORS – определяет цветовые коды, используемые для добавления цветного вывода при вводе команды ls. Это помогает различать типы файлов и предоставляет информацию пользователям.
LOGNAME – имя текущего пользователя.
MAIL – определяет путь к почтовому ящику текущего пользователя.
LANG – определяет текущую настройку локали.
PATH – указывает список каталогов для поиска при выполнении команд. Во время выполнения команды система ищет по этим каталогам и использует первый найденный исполняемый файл.
_ – последняя выполненная команда.
Общие переменные оболочки:
BASH_VERSION – версия bash в удобном для чтения человеком формате.
BASH_VERSINFO – версия bash в машиночитаемом формате.
BASHOPTS – список параметров, которые использовались при запуске bash. Полезно для определения того, будет ли среда оболочки работать так, как вы ожидаете.
COLUMNS – ширина экрана в столбцах, используемая для вывода информации.
DIRSTACK – стек каталогов, доступных с помощью команд pushd и popd.
HOSTNAME – имя хоста компьютера на данный момент.
HISTFILESIZE – количество строк истории команд, хранящихся в файле.
HISTSIZE – количество строк истории команд, разрешенных в памяти.
IFS – внутренний разделитель полей для разделения ввода в командной строке. По умолчанию это пробел.
SHELLOPTS-Используется для установки параметров оболочки.
UID-UID текущего пользователя.
PS1– определение основного приглашения командной строки. Используется для определения того, как выглядит ваше приглашение при запуске сеанса оболочки.
PS2 – объявление вторичных приглашений для случаев, когда команда занимает несколько строк.
Настройка команд окружения и оболочки
Во-первых, как объяснялось ранее, мы будем писать имена переменных заглавными буквами. Далее мы рассмотрим создание переменных оболочки. Наконец, мы создадим переменные окружения.
Создание переменных оболочки
Начнем с обычного hello world. Введите в терминале следующее:
|
1 |
MY_FIRST_VAR=’Hello World!’ |
Кавычки используются потому, что в значении переменной есть пробел. Обратите внимание, что мы использовали одинарные кавычки, так как восклицательный знак является специальным символом и его нужно либо экранировать, либо заключать в одинарные кавычки. Итак, вы создали свою первую переменную оболочки. Она доступна только в текущем сеансе оболочки. Переменные оболочки недоступны для дочерних оболочек и процессов. Вы можете вывести ее в терминал с помощью команды set с grep:

Или отобразить значение с помощью echo, обратившись к нему с помощью знака $ и имени переменной:

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

Создание переменных окружения
Ранее созданную переменную оболочки можно превратить в переменную окружения с помощью команды export. Сначала вы создаете переменную оболочки. Затем, чтобы создать переменную окружения, вам нужно использовать команду export. После выполнения этой команды переменная станет доступна для дочерних оболочек и процессов:
|
1 |
export MY_FIRST_VAR |
Теперь, если вы выполните проверку с помощью команды printenv, вы должны увидеть переменную и значение:

Вы также можете создать переменную окружения в один шаг, используя следующий синтаксис:
|
1 |
export MY_SECOND_VAR='Это моя вторая переменная' |
Переменные окружения передаются только дочерним оболочкам, но не родительской. Это помогает предотвратить влияние дочерних процессов на окружение вызвавшей их программы.
Понижение статуса и удаление переменных
Если вы следовали руководству до этого момента, то у вас все еще определена переменная MY_FIRST_VAR как переменная окружения. Вы можете вернуть ее обратно в статус переменной оболочки, введя команду export с флагом –n:
|
1 |
export -n MY_FIRST_VAR |
Если вы проверите это с помощью printenv, вывода не будет. Однако команда echo отобразит ее, так как она все еще является переменной оболочки:

Вы можете удалить как переменную оболочки, так и переменную окружения с помощью команды unset. И вы можете убедиться, что она больше не существует, используя echo. Как видите, вывод отсутствует:

Настройка переменных окружения при входе в систему
Многие программы зависят от переменных окружения для своего выполнения. Поскольку неэффективно настраивать переменные каждый раз, когда вы хотите запустить программу, Linux предоставляет способ определить их и сохранить в файл. Таким образом, они могут устанавливаться автоматически при входе в систему. Оболочка считывает различные конфигурационные файлы в зависимости от того, как запущен сеанс. Они обсуждаются ниже:
Типы сеансов оболочки и их различия
- Сеанс оболочки со входом (Login Shell Session) — начинается с аутентификации пользователя. Сеанс устанавливается, когда вы входите через SSH или сеанс терминала.
- Сеанс оболочки без входа (Non-login Shell Session) — начинается, когда вы запускаете новую оболочку из уже аутентифицированной оболочки. Вы можете запустить новую оболочку с помощью команды bash. Данные аутентификации не требуются.
- Интерактивный сеанс оболочки (Interactive Shell Session) — сеанс оболочки, привязанный к сеансу терминала.
- Неинтерактивный сеанс оболочки (Non-interactive Shell Session) — сеанс оболочки, не привязанный к сеансу терминала, выполняется в фоновом режиме.
Сеанс классифицируется как сеанс со входом (login) или без входа (non-login), а также как интерактивный (interactive) или неинтерактивный (non-interactive). Когда вы входите в систему и начинаете сеанс оболочки через SSH, это будет интерактивный сеанс оболочки со входом. Когда вы запускаете скрипт в терминале, он обычно выполняется в неинтерактивном сеансе без входа. Сеанс оболочки также может быть комбинацией этих двух типов. Итак, какой же конфигурационный файл выбирается?
Сеанс со входом сначала считывает конфигурационные файлы из каталога /etc/profile. Во-вторых, он проверяет специфичные для пользователя конфигурационные файлы из домашнего каталога пользователя. Считывается только первый найденный файл из ~/.bash_profile, ~/.bash_login и ~/.profile, а все остальные файлы игнорируются. Сеанс без входа сначала считывает данные из /etc/bash.bashrc, а затем из ~/.bashrc. Неинтерактивные сеансы считывают переменную окружения с именем BASH_ENV, чтобы получить имя файла, который будет использоваться для определения нового окружения.
Применение переменных окружения
При установке переменных всегда обращайте внимание на то, в какой файл вы их помещаете, основываясь на нашем обсуждении выше. Это обеспечит гибкость, гарантируя, что определенные переменные будут доступны только в определенных сеансах. Вы ведь не хотите, чтобы важная переменная отсутствовала в одном из сеансов.
В некоторых случаях нам нужно, чтобы переменная существовала как в сеансах со входом, так и без входа. К счастью, большинство дистрибутивов Linux по умолчанию настроены так, что конфигурации входа считывают конфигурации без входа и делают их доступными для ваших процессов. Следовательно, вы можете просто определить свои переменные в конфигурационных файлах без входа. Обычно мы устанавливаем переменные окружения для конкретного пользователя и хотим, чтобы наши настройки были доступны как в сеансах оболочки со входом, так и без входа. По этой причине мы будем использовать файл ~/.bashrc. Для редактирования файла мы будем использовать nano. Введите следующее в терминале, чтобы открыть файл:
|
1 |
nano ~/.bashrc |
В открытом конфигурационном файле вы уже можете увидеть несколько переменных. Вы можете добавлять переменные окружения так же, как и при использовании командной строки. Просто введите команду:
|
1 |
export KEYNAME=value. |
Вы можете добавить их в любое место файла — на новой строке и не внутри функции цикла. Затем сохраните и закройте файл. Любой следующий сеанс оболочки, который вы запустите, будет считывать данные из этого файла. Если вы хотите, чтобы текущая оболочка прочитала только что добавленные настройки без необходимости её перезапуска, вы можете использовать команду:
|
1 |
source ~/.bashrc |
Системные переменные окружения следует добавлять в любой из следующих файлов: /etc/profile, /etc/bash.bashrc или /etc/environment.
Подводя итоги
Наконец, теперь вы можете настраивать переменные оболочки и окружения и наслаждаться огромными возможностями, которые эти инструменты предоставляют вашему VPS! Это дает множество преимуществ, таких как автоматизация запуска некоторых процессов, автоматическая настройка развертывания, требующая аутентификационных данных, передача переменных дочерним процессам и многое другое. Переменные окружения помогают скрыть конфиденциальные данные, такие как информация для аутентификации, от публичных репозиториев, помимо прочих данных. С этой основой вы можете создавать сложные скрипты, которые можно выполнять автоматически через командную строку без необходимости постоянного ввода со стороны пользователя.
Приятной работы!
Комментарии
Комментариев пока нет. Будьте первым.