Команда cd
без аргументов делает домашнюю директорию пользователя рабочей. Возникает вопрос, каким образом она узнает о том, где находится домашняя директория?
Можно предположить, что команда cd
каким-то образом обращается к операционной системе и узнает у нее эту информацию или смотрит напрямую в конфигурационных файлах. Но ни первого, ни второго она не делает.
Эта команда ориентируется на так называемую переменную окружения, которую мы изучим в этом уроке.
Что такое переменные окружения
Переменные окружения похожи на переменные в языках программирования. Они существуют в рамках запущенной сессии командной оболочки, то есть, переменные пропадут, когда терминал закроется. Они подгружаются туда во время его инициализации, хотя это не единственный путь их появления.
Посмотреть установленные переменные можно командой env
(environment). Ниже неполный список этих переменных, которые доступны на одном из серверов Хекслета:
env
TERM=xterm-256color
SHELL=/bin/bash
LC_ALL=en_US.UTF-8
USER=kirill.m
HEXLET_VERSION=v2711
PATH=/home/kirill.m/bin:/home/kirill.m/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PWD=/home/kirill.m
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/kirill.m
LOGNAME=kirill.m
Формат вывода очень простой: слева от знака равно расположено имя переменной, справа — значение. В вашем случае вывод команды env
будет отличаться не только значениями этих переменных, но и их составом. Например, у вас точно не будет HEXLET_VERSION
, но наверняка будет HOME
, только с другим значением.
Основное предназначение переменных окружения — конфигурирование системы и программ. Их удобство заключается в универсальности. Кроме того, они помогают отвязать нас от способа появления этих значений в системе.
Возьмем для примера ту же команду cd
. Она знает лишь то, что домашняя директория доступна в переменной окружения HOME
. Как она попала в систему — не важно.
Без переменной окружения пришлось бы делать одну из двух вещей:
- При вызове
cd
каждый раз указывать, где находится домашняя директория. Например, так:cd --home-dir /home/kirill.m
. Такой способ убивает весь смысл быстрого перехода в домашнюю директорию - Договариваться, что где-то будет храниться специальный файл с настройками, в том числе домашней директории. Настройки из этого файла будут читаться командой
cd
при каждом запуске
Существует некоторый базовый набор переменных, которые всегда устанавливаются bash при старте. Они используются большим количеством утилит и нужны для нормального функционирования системы. Одну из таких переменных мы уже знаем — это HOME
:
# Для вывода переменной используется echo,
# а перед самой переменной ставится знак $
echo $HOME
/home/kirill.m
# Вокруг знака `=` не должно быть пробелов
HOME=/tmp
echo $HOME
/tmp
# Возвращаем обратно
HOME=/home/kirill.m
echo $HOME
/home/kirill.m
Теперь проведем эксперимент: попробуем установить HOME
и выполнить переход в эту директорию с помощью команды cd
, которая должна отправить нас в домашнюю директорию:
# Достаточно выполнить присваивание слева от запускаемой команды
HOME=/tmp cd
/tmp
pwd
/tmp
Команда cd
выполнила переход по пути, указанном в переменной HOME
. Теперь снова сделаем cd
, но не добавляя определение переменной слева:
cd
pwd
/home/kirill.m
echo $HOME
/home/kirill.m
В этот раз произошел переход в настоящую домашнюю директорию. Получается, что вызов HOME=/tmp cd
изменил переменную только для того конкретного запуска. И действительно, существует два способа задавать значение переменной окружения: локальный и глобальный.
Когда мы указали HOME=/tmp
прямо перед командой cd
, то переменная не была изменена для текущей сессии — она была изменена для запущенной команды, в данном случае cd
. Такой трюк можно проделывать с любой командой.
Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:
echo $HOME
/home/kirill.m
export HOME=/tmp
cd
pwd
/tmp
echo $HOME
/tmp
Обратите внимание, что изменение происходит в рамках текущей сессии. Другими словами, если у нас открыто две вкладки терминала, то изменение произойдет только в той вкладке, в которой мы написали команду.
Особую роль среди переменных окружения играет PATH
— еще одна важная переменная. Сложности с ней возникают настолько часто, что этой переменной посвящен практически целый урок впереди.
Самостоятельная работа
Изучите переменные окружения в вашей локальной среде, набрав команду env
.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты