Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Переменные окружения

Напомним, что команда 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 при каждом запуске.

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

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

Теперь проведём эксперимент: попробуем установить 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. Такой трюк можно проделывать с любой командой. Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:

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

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

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

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

  • Изучите переменные окружения в вашей локальной среде набрав env

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».