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).