Education 1.1 Help

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

Команда 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

asciinema

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

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

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

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

asciinema

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

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

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

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

Дополнительные материалы

  1. Определение переменной окружения с командой export и без нее

Вопросы для самопроверки

Зачем нужны переменные окружения?

  • Чтобы использовать их для настройки во время запуска во многих программах

  • Чтобы выполнять навигацию по файловой системе

  • Чтобы работать с ядром операционной системы

Как правильно создать переменную окружения?

  • KEY = value

  • KEY =value

  • KEY=value

  • KEY= value

Как правильно обратиться к переменной окружения KEY?

  • KEY$

  • $KEY

  • KEY

Last modified: 12 June 2024