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