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

> Именованные строковые значения, которые каждый процесс получает от родителя и передаёт дочерним; через них настраиваются программы — PATH, HOME, LANG, адреса сервисов, режимы работы и ключи доступа.

Источник: https://llmdocs.ru/wiki/environment-variables/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Что это**: пары ИМЯ=значение в окружении процесса
- **Наследование**: копируются от родителя к дочернему процессу
- **Просмотр**: env, printenv, echo $ИМЯ
- **Установка в Bash**: export ИМЯ=значение
- **Стандартные**: PATH, HOME, USER, SHELL, LANG, TZ, PWD
- **Принцип конфигурации**: The Twelve-Factor App — конфигурация в окружении
**Переменные окружения** — именованные строковые значения вида `ИМЯ=значение`, которые есть у каждого процесса в Unix-подобных системах (и в Windows). Процесс получает копию окружения от родителя при запуске и может передать её — с изменениями — своим дочерним процессам.[1] Через переменные окружения программы узнают, где искать исполняемые файлы (`PATH`), домашний каталог пользователя (`HOME`), язык интерфейса (`LANG`), а приложения — адрес базы данных, режим работы и ключи доступа к API.

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

## Основы

```bash
echo $HOME                    # прочитать
printenv PATH                 # то же
env                           # все переменные окружения
export APP_ENV=production     # установить для текущей оболочки и всех дочерних процессов
DEBUG=1 python app.py         # установить только для одной команды
unset APP_ENV                 # удалить
```

Важно различать **переменные оболочки** и **переменные окружения**. Присваивание `NAME=value` в [Bash](https://llmdocs.ru/wiki/shell-bash.md) создаёт переменную только в текущей оболочке; `export` делает её частью окружения, которое унаследуют запущенные программы.[3] Изменение окружения дочерним процессом никогда не влияет на родителя — поэтому скрипт, запущенный как `./set_env.sh`, не может поменять переменные вашей оболочки; для этого его выполняют через `source set_env.sh`.

## Стандартные переменные

| Переменная | Значение |
|---|---|
| `PATH` | каталоги через двоеточие, где оболочка ищет команды |
| `HOME` | домашний каталог пользователя |
| `USER`, `LOGNAME` | имя пользователя |
| `SHELL` | оболочка пользователя по умолчанию |
| `PWD` | текущий каталог |
| `LANG`, `LC_*` | язык и региональные настройки (`ru_RU.UTF-8`) |
| `TZ` | часовой пояс (`Europe/Moscow`) |
| `EDITOR` | редактор по умолчанию для `git commit`, `crontab -e` |
| `TMPDIR` | каталог для временных файлов |

Многие из них определены в стандарте POSIX.[2] Порядок каталогов в `PATH` важен: побеждает первая найденная программа. Узнать, какая именно запустится, помогает `command -v python` или `which python`.

## Где задаются постоянно

- `~/.bashrc`, `~/.zshrc` — для интерактивных оболочек пользователя;
- `~/.profile`, `~/.bash_profile` — для оболочек входа;
- `/etc/environment`, `/etc/profile.d/*.sh` — для всех пользователей;
- в юнитах [systemd](https://llmdocs.ru/wiki/systemd.md) — директивы `Environment=` и `EnvironmentFile=`: службы не читают `~/.bashrc`;
- в crontab — строки `ИМЯ=значение` в начале файла (см. [cron и таймеры systemd](https://llmdocs.ru/wiki/cron-systemd-timers.md)).

## Конфигурация приложений

Методология **The Twelve-Factor App** рекомендует хранить конфигурацию, которая отличается между окружениями (разработка, тест, продакшен), в переменных окружения, а не в коде: один и тот же собранный артефакт запускается везде, меняются только переменные.[4]

```python
import os

DATABASE_URL = os.environ["DATABASE_URL"]               # обязательная — упадёт, если не задана
DEBUG = os.environ.get("DEBUG", "0") == "1"             # необязательная со значением по умолчанию
WORKERS = int(os.getenv("WORKERS", "4"))
```

Все значения — строки, поэтому их нужно преобразовывать и проверять. Удобно делать это одной моделью настроек, например через pydantic-settings (см. [Dataclasses и Pydantic](https://llmdocs.ru/wiki/dataclasses-pydantic.md)).[5]

### Файлы .env

При локальной разработке переменные хранят в файле `.env` в корне проекта:

```text
DATABASE_URL=postgresql://app:secret@localhost:5432/app
REDIS_URL=redis://localhost:6379/0
DEBUG=1
```

Его загружают библиотеки вроде python-dotenv, [Docker Compose](https://llmdocs.ru/wiki/docker-compose.md) (автоматически для подстановок в `compose.yaml`)[6] и `uv run --env-file .env`. Файл `.env` с реальными значениями **никогда не коммитят** — в [Git](https://llmdocs.ru/wiki/git.md) кладут шаблон `.env.example` без секретов, а `.env` добавляют в `.gitignore`.

## Контейнеры и Kubernetes

```bash
docker run -e APP_ENV=production --env-file prod.env myapp:1.0
```

В [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md) переменные контейнеров берутся из манифеста, ConfigMap и Secret (см. [ConfigMap и Secret](https://llmdocs.ru/wiki/configmap-secret.md)). Изменение переменной требует перезапуска процесса: окружение читается при старте и само не обновляется.

## Секреты в переменных окружения

Переменные окружения — распространённый способ передать приложению пароли и ключи, но у него есть риски:

- окружение процесса может прочитать тот же пользователь или root через `/proc/<PID>/environ`;
- переменные наследуются всеми дочерними процессами, в том числе сторонними утилитами;
- они попадают в отчёты об ошибках, отладочный вывод и логи, если их неосторожно распечатать;
- `docker inspect` показывает переменные контейнера.

Для чувствительных данных лучше использовать специализированные хранилища и монтирование секретов файлами (см. [Управление секретами](https://llmdocs.ru/wiki/secrets-management.md)), а в переменных передавать хотя бы не больше, чем нужно.

## Типичные ошибки

- Пробелы вокруг `=` в Bash: `export NAME = value` не работает, нужно `export NAME=value`.
- Значения с пробелами без кавычек: `export GREETING="Привет, мир"`.
- Служба systemd или задача cron «не видит» переменную из `~/.bashrc` — у них своё окружение.
- Опечатка в имени необязательной переменной молча включает значение по умолчанию — обязательные настройки стоит проверять при старте.

## См. также

- [Shell и Bash](https://llmdocs.ru/wiki/shell-bash.md)
- [Управление секретами](https://llmdocs.ru/wiki/secrets-management.md)
- [Docker Compose](https://llmdocs.ru/wiki/docker-compose.md)
- [systemd](https://llmdocs.ru/wiki/systemd.md)
- [ConfigMap и Secret](https://llmdocs.ru/wiki/configmap-secret.md)

## Источники

1. [environ(7) — Linux manual page](https://man7.org/linux/man-pages/man7/environ.7.html)
2. [POSIX.1-2024 — Environment Variables](https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap08.html)
3. [GNU Bash manual — Environment](https://www.gnu.org/software/bash/manual/html_node/Environment.html)
4. [The Twelve-Factor App — Config](https://12factor.net/config)
5. [Python — os.environ](https://docs.python.org/3/library/os.html#os.environ)
6. [Docker Docs — Set environment variables in Compose](https://docs.docker.com/compose/how-tos/environment-variables/)
