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

Напомним, что команда cd без аргументов делает домашнюю директорию пользователя рабочей (working directory). Возникает вопрос, каким образом она узнаёт о том, где находится домашняя директория? Можно предположить, что команда 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 при каждом запуске.

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

По умолчанию любой запущенный процесс получает все переменные родительского процесса (процесс-создатель). Именно поэтому команда cd может прочитать переменную HOME. Переменные можно создавать и изменять в любой момент времени, например:

# Для вывода переменной используется echo, а перед самой переменной ставится знак $.
$ echo $HOME
/home/kirill.m
# Для установки знак $ не нужен.
# Очень важно чтобы не было пробелов вокруг знака равно
$ HOME=/tmp

Теперь проведём эксперимент: попробуем установить HOME и выполнить переход.

# Достаточно выполнить присваивание слева от запускаемой команды
$ HOME=/tmp cd
/tmp$ pwd
/tmp

Ничего не подозревающая команда cd получила переменную HOME и выполнила честный переход в указанную директорию. Теперь снова сделаем cd, но уже не указывая ничего.

$ cd
~$ pwd
/home/kirill.m
~$ echo $HOME
/home/kirill.m

В этот раз произошел переход в настоящую домашнюю директорию. Получается, что вызов выше изменил переменную только для того конкретного запуска. И действительно, существует два способа задавать значение переменной окружения: локальный и глобальный. Когда мы указали HOME=/tmp прямо перед командой cd, то переменная не была изменена для текущей сессии — она была изменена для запущенной команды, в данном случае cd. Такой трюк можно проделывать с любой командой. Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:

~$ export HOME=/tmp
/home/kirill.m$ cd
~$ pwd
/tmp
~$ echo $HOME
/tmp

Обратите внимание на то, что изменение происходит в рамках текущей сессии, другими словами, если у вас открыто две вкладки терминала, и в каждой загружен баш, то изменение произойдет только в той вкладке, в которой будет выполнена команда.

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

Самостоятельная работа

  • Изучите переменные окружения в вашей локальной среде набрав env
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →