Переменные окружения
Команда cd
без аргументов делает домашнюю директорию пользователя рабочей. Возникает вопрос, каким образом она узнает о том, где находится домашняя директория?
Можно предположить, что команда cd
каким-то образом обращается к операционной системе и узнает у нее эту информацию или смотрит напрямую в конфигурационных файлах. Но ни первого, ни второго она не делает.
Эта команда ориентируется на так называемую переменную окружения, которую мы изучим в этом уроке.
Что такое переменные окружения
Переменные окружения похожи на переменные в языках программирования. Они существуют в рамках запущенной сессии командной оболочки, то есть, переменные пропадут, когда терминал закроется. Они подгружаются туда во время его инициализации, хотя это не единственный путь их появления.
Посмотреть установленные переменные можно командой env
(environment). Ниже неполный список этих переменных, которые доступны на одном из серверов Хекслета:
Формат вывода очень простой: слева от знака равно расположено имя переменной, справа — значение. В вашем случае вывод команды env
будет отличаться не только значениями этих переменных, но и их составом. Например, у вас точно не будет HEXLET_VERSION
, но наверняка будет HOME
, только с другим значением.
Основное предназначение переменных окружения — конфигурирование системы и программ. Их удобство заключается в универсальности и отвязке от способа появления этих значений в системе.
Возьмем для примера ту же команду cd
. Она знает лишь то, что домашняя директория доступна в переменной окружения HOME
. Как она попала в систему — не важно.
Без переменной окружения пришлось бы делать одну из двух вещей:
При вызове
cd
каждый раз указывать, где находится домашняя директория. Например, так:cd --home-dir /home/kirill.m
. Такой способ убивает весь смысл быстрого перехода в домашнюю директориюДоговариваться, что где-то будет храниться специальный файл с настройками, в том числе домашней директории. Настройки из этого файла будут читаться командой
cd
при каждом запуске
Существует некоторый базовый набор переменных, которые всегда устанавливаются bash при старте. Они используются большим количеством утилит и нужны для нормального функционирования системы. Одну из таких переменных мы уже знаем — это HOME
:
Теперь проведем эксперимент: попробуем установить HOME
и выполнить переход в эту директорию с помощью команды cd
, которая должна отправить нас в домашнюю директорию:
В этот раз произошел переход в настоящую домашнюю директорию. Получается, что вызов HOME=/tmp cd
изменил переменную только для того конкретного запуска. И действительно, существует два способа задавать значение переменной окружения: локальный и глобальный.
Когда мы указали HOME=/tmp
прямо перед командой cd
, то переменная не была изменена для текущей сессии — она была изменена для запущенной команды, в данном случае cd. Такой трюк можно проделывать с любой командой.
Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:
Обратите внимание, что изменение происходит в рамках текущей сессии. Другими словами, если у нас открыто две вкладки терминала, то изменение произойдет только в той вкладке, в которой мы написали команду.
Особую роль среди переменных окружения играет PATH
— еще одна важная переменная. Сложности с ней возникают настолько часто, что этой переменной посвящен практически целый урок впереди.
Самостоятельная работа
Изучите переменные окружения в вашей локальной среде, набрав команду env.
Дополнительные материалы
Вопросы для самопроверки
Зачем нужны переменные окружения?
Чтобы использовать их для настройки во время запуска во многих программах
Чтобы выполнять навигацию по файловой системе
Чтобы работать с ядром операционной системы
Как правильно создать переменную окружения?
KEY = value
KEY =value
KEY=value
KEY= value
Как правильно обратиться к переменной окружения KEY?
KEY$
$KEY
KEY