Gymterview
junior

Что такое переменные окружения и как с ними работать?

Переменные окружения — это именованные значения (пары ключ=значение), которые доступны процессу и передаются всем его дочерним процессам. Они используются для конфигурации программ без изменения кода.

Аналогия

Переменные окружения — как табличка на двери офиса: любой, кто заходит (дочерний процесс), видит информацию (имя отдела, номер телефона). Локальные переменные — это записка на вашем рабочем столе, видная только вам.

Основные системные переменные

Переменная Описание
PATH Список директорий для поиска исполняемых файлов (разделитель :)
HOME Домашняя директория пользователя
USER Имя текущего пользователя
SHELL Путь к текущей оболочке
PWD Текущая рабочая директория
LANG Локаль (язык и кодировка)
JAVA_HOME Путь к JDK (важно для Java-разработчика)
EDITOR Текстовый редактор по умолчанию

Просмотр переменных

Пример
echo $HOME                       # Значение конкретной переменной
echo $PATH                       # Вывести PATH
env                              # Все переменные окружения
printenv                         # Аналог env
printenv PATH                    # Конкретная переменная через printenv
set                              # Все переменные (включая локальные)

Создание и экспорт переменных

Пример
# Локальная переменная (доступна только в текущем shell)
MY_VAR="hello"
echo $MY_VAR

# Экспорт (доступна дочерним процессам)
export MY_VAR="hello"

# Создание и экспорт одной строкой
export JAVA_HOME=/usr/lib/jvm/java-17

# Добавить путь в PATH
export PATH=$PATH:/opt/maven/bin

# Удалить переменную
unset MY_VAR

# Установить переменную только для одной команды
SPRING_PROFILES_ACTIVE=dev java -jar app.jar

Подстановка переменных

Пример
echo "Home: $HOME"               # Подстановка в двойных кавычках
echo 'Home: $HOME'               # Одинарные кавычки — нет подстановки!
echo "Java: ${JAVA_HOME}/bin"    # Фигурные скобки для явного отделения имени
echo "${VAR:-default}"           # Значение по умолчанию, если VAR не задана
echo "${VAR:=default}"           # Установить default, если VAR не задана
echo "${#VAR}"                   # Длина значения переменной

Постоянное сохранение переменных

Пример
# Добавить в ~/.bashrc (для bash) или ~/.zshrc (для zsh):
echo 'export JAVA_HOME=/usr/lib/jvm/java-17' >> ~/.bashrc
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc

# Применить изменения без перезапуска терминала
source ~/.bashrc
# или
. ~/.bashrc

На собеседовании: интервьюер хочет услышать разницу между локальной переменной (VAR=value) и экспортированной (export VAR=value), а также понимание PATH. Частая ошибка — ставить пробелы вокруг = при присваивании (VAR = value — это вызов команды VAR с аргументами = и value).