Открыть сервис

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

Переменная окружения (англ. environment variable) — это динамическое именованное значение, хранящееся в операционной системе и доступное запускаемым процессам. Переменные окружения используются для передачи конфигурационной информации приложениям и скриптам, не требуя её жёсткого кодирования в исходном коде. Они представляют собой пары «ключ-значение» (например, PATH=/usr/bin:/bin), где ключ — имя переменной, а значение — строка данных.

Назначение и принцип работы

Переменные окружения служат для настройки поведения программ и операционной системы без изменения их кода. Основные задачи включают:

  • Указание путей к исполняемым файлам (переменная PATH в Unix-подобных системах и Windows).
  • Хранение параметров локализации (LANG, LC_ALL) — язык, кодировка, региональные настройки.
  • Передача секретных данных (токенов, паролей, ключей API) — позволяет не хранить их в файлах конфигурации.
  • Настройка временных параметров (например, TMPDIR — путь к каталогу временных файлов).
  • Управление поведением приложений (флаги отладки, режимы работы, указание серверов).

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

История

Концепция переменных окружения возникла в ранних Unix-системах (1970-е годы) как часть механизма передачи параметров процессам. В оригинальной реализации Unix (Version 7) окружение передавалось через третий аргумент функции main() в языке C (char *envp[]). Впоследствии появились стандартные функции доступа: getenv() (чтение), setenv() (установка), putenv() (добавление).

В операционной системе MS-DOS (1981) переменные окружения были реализованы в виде небольшого блока памяти (обычно 256 байт), доступного через команду SET. В Windows NT (1993) механизм был расширен: появились системные и пользовательские переменные, а также поддержка длинных имён и значений.

В современных системах (Linux, macOS, Windows) переменные окружения являются стандартным средством конфигурации. В облачных и контейнерных средах (Docker, Kubernetes) они широко используются для настройки микросервисов.

Классификация

Переменные окружения делятся по области действия и способу установки.

По области действия

  • Системные (глобальные) — доступны всем процессам, запущенным в системе. Устанавливаются администратором и хранятся в системном реестре (Windows) или в файлах /etc/environment, /etc/profile (Linux).
  • Пользовательские — доступны только процессам, запущенным от имени конкретного пользователя. Хранятся в профиле пользователя (Windows: реестр HKEY_CURRENT_USER\Environment; Linux: ~/.profile, ~/.bashrc).
  • Локальные (сеансовые) — действуют только в рамках текущего сеанса командной оболочки или процесса. Устанавливаются вручную в командной строке или скрипте.

По способу установки

  • Статические — задаются в конфигурационных файлах или реестре и сохраняются между перезагрузками.
  • Динамические — вычисляются при входе в систему или запуске процесса (например, HOME, USER, LOGNAME).
  • Временные — устанавливаются в командной строке и действуют только до завершения сеанса.

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

В Unix-подобных системах (Linux, macOS)

ПеременнаяНазначениеПример значения
PATHСписок каталогов для поиска исполняемых файлов/usr/local/bin:/usr/bin:/bin
HOMEДомашний каталог текущего пользователя/home/user
USERИмя текущего пользователяuser
SHELLПуть к командной оболочке/bin/bash
LANGЯзык и кодировка по умолчаниюru_RU.UTF-8
TMPDIRКаталог для временных файлов/tmp
EDITORРедактор по умолчанию/usr/bin/vim
DISPLAYАдрес X-сервера (графическая среда):0

В Windows

ПеременнаяНазначениеПример значения
PATHСписок каталогов для поиска исполняемых файловC:\Windows\System32;C:\Program Files
USERPROFILEПуть к профилю пользователяC:\Users\user
APPDATAКаталог для данных приложений (roaming)C:\Users\user\AppData\Roaming
TEMPКаталог для временных файловC:\Users\user\AppData\Local\Temp
COMPUTERNAMEИмя компьютера в сетиDESKTOP-ABC123
OSТип операционной системыWindows_NT
NUMBER_OF_PROCESSORSКоличество ядер процессора4

Управление переменными окружения

В командной строке

Unix-подобные системы (bash):

  • Установка: export VAR_NAME=value
  • Просмотр: echo $VAR_NAME или printenv
  • Удаление: unset VAR_NAME

Windows (cmd):

  • Установка: set VAR_NAME=value
  • Просмотр: echo %VAR_NAME% или set
  • Удаление: set VAR_NAME=

Windows (PowerShell):

  • Установка: $env:VAR_NAME = "value"
  • Просмотр: $env:VAR_NAME или Get-ChildItem Env:
  • Удаление: Remove-Item Env:VAR_NAME

В конфигурационных файлах

Linux:

  • /etc/environment — системные переменные (формат VAR=value, без экспорта).
  • /etc/profile — системные переменные для оболочек входа.
  • ~/.profile, ~/.bashrc, ~/.zshrc — пользовательские переменные.

Windows:

  • Системные переменные: «Панель управления» → «Система» → «Дополнительные параметры системы» → «Переменные среды».
  • Пользовательские переменные: там же, в разделе «Переменные среды пользователя».

В контейнерах и облачных средах

Docker:

  • В Dockerfile: ENV VAR_NAME=value
  • При запуске контейнера: docker run -e VAR_NAME=value image

Kubernetes:

  • В манифесте Pod: в разделе spec.containers.env:

```yaml env:

  • name: VAR_NAME

value: "value" ```

Облачные платформы (Heroku, AWS, Яндекс.Облако):

  • Переменные задаются через веб-интерфейс или CLI-инструменты.

Безопасность

Хранение секретов (паролей, ключей API) в переменных окружения считается более безопасным, чем в коде, но не лишено рисков. Основные угрозы:

  • Утечка через процессы — любой процесс, запущенный от того же пользователя, может прочитать окружение (например, через /proc/[pid]/environ в Linux).
  • Логирование — некоторые системы могут записывать переменные окружения в логи при запуске (например, при отладке).
  • Передача по сети — в контейнерных средах переменные могут быть видны в метаданных.

Для защиты секретов рекомендуется:

  • Использовать специализированные хранилища (Vault, AWS Secrets Manager, Kubernetes Secrets).
  • Не задавать секреты в файлах, доступных для чтения всем пользователям.
  • Ограничивать доступ к конфигурационным файлам (например, chmod 600 ~/.profile).
  • В контейнерах — использовать временные переменные, не сохраняемые в образе.

Применение в разработке

Переменные окружения широко используются в современных методологиях разработки, особенно в парадигме «Двенадцать факторов» (12-factor app), где они являются основным способом конфигурации приложений. Это позволяет:

  • Разделять конфигурацию и код.
  • Легко менять параметры между средами (разработка, тестирование, продакшн).
  • Избегать хранения секретов в репозиториях.

Примеры использования:

  • Указание URL базы данных (DATABASE_URL).
  • Настройка уровня логирования (LOG_LEVEL=debug).
  • Передача ключей доступа к сторонним сервисам (API_KEY).

Ограничения и критика

  • Отсутствие типизации — все значения хранятся как строки, что требует ручного преобразования.
  • Ограничение на размер — в некоторых системах (например, старые версии Windows) длина значения ограничена 1024 символами.
  • Сложность отладки — ошибки в именах переменных (опечатки) могут приводить к неожиданному поведению.
  • Проблемы с кодировкой — в Windows значения могут быть в разных кодировках, что вызывает ошибки при передаче между системами.

Источники

  1. Брайан Керниган, Деннис Ритчи. «Язык программирования C». — 2-е изд. — М.: Вильямс, 2009. — Глава 5.
  2. Стивенс Р., Раго С. «UNIX: Профессиональное программирование». — 3-е изд. — СПб.: Питер, 2014. — Глава 7.
  3. Документация Microsoft: «Переменные среды в Windows» (docs.microsoft.com).
  4. Документация Linux: man 7 environ — описание окружения процесса.
  5. Wiggins A. «The Twelve-Factor App» (12factor.net).
  6. Документация Docker: «Environment variables» (docs.docker.com).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →