Переменные окружения в Linux — подробное руководство

Быстрые ссылки
- Как работают переменные окружения
- Наследование окружений
- Глобальные переменные окружения
- Как задать глобальную переменную в Linux
- Полезные переменные Bash
- Как задать переменную Bash
- Удалённые подключения и переменные окружения
- Удаление переменной окружения
- Контроль окружения
Краткое содержание
- Переменные окружения определяют настройки терминала и оболочки.
- Типы переменных: системные (глобальные), сессии пользователя, переменные оболочки.
- Просматривать значения можно через echo и printenv; делать постоянными — редактируя /etc/environment, .bashrc, .bash_profile.
Как работают переменные окружения
Когда вы запускаете терминал и оболочку (shell), система собирает набор переменных, которые описывают текущее окружение. Эти значения нужны, чтобы корректно запускать команды, находить программы, отображать приглашение и учитывать локализацию.
Определение в одну строку: переменная окружения — именованное значение, доступное процессу и (опционально) его дочерним процессам.
- Системные переменные видны всем пользователям и задаются глобально.
- Переменные сессии видны только в текущей сессии пользователя.
- Переменные оболочки (локальные) существуют только в рамках конкретного процесса оболочки, пока вы их не экспортируете.
Переменные используются для хранения: путей поиска, настроек локализации, пути до домашней папки, конфигурации приложений и т. д.
Наследование окружений
Когда процесс (например, оболочка) запускает другой процесс — дочерний — он по умолчанию передаёт ему своё окружение. Но не все значения автоматически попадают в это окружение. Есть разница между просто переменной (локальной для процесса) и экспортированной переменной (которая включена в окружение процесса).
Ключевые моменты:
- export делает переменную частью окружения и позволяет дочерним процессам её читать.
- Локальные переменные (без export) видны только самой оболочке, где они были созданы.
- Если дочерний процесс — новый экземпляр оболочки, он может инициализироваться из своих конфигурационных файлов, и изменения приглашения текущей оболочки не всегда переходят в дочерний.
Пример: если вы изменили PS1 в текущей оболочке, затем запустили bash (новая оболочка), новая оболочка может установить своё PS1 из файла .bashrc и не унаследовать runtime-изменение.
Глобальные переменные окружения
По соглашению имена переменных окружения пишутся заглавными буквами. Ниже — наиболее часто встречающиеся системные переменные и их значение:
- SHELL — имя оболочки, которая запускается при открытии терминала (обычно /bin/bash или /bin/zsh).
- TERM — тип терминала (например xterm-256color), влияет на цвет и управление курсором.
- USER — имя текущего пользователя.
- PWD — текущая рабочая директория.
- OLDPWD — предыдущая рабочая директория.
- LS_COLORS — таблица цветов для вывода ls.
- MAIL — путь к почтовому ящику пользователя (если настроено).
- PATH — список директорий для поиска исполняемых файлов.
- LANG — настройки локали и кодировки.
- HOME — домашняя директория пользователя.
- _ — специальная переменная, содержащая последний аргумент последней команды или иногда имя выполненной команды в некоторых оболочках.
Примеры просмотра значений:
echo $SHELLecho $LANGecho $HOMEecho $PWDСовет: автодополнение работает и для имён переменных: наберите несколько букв после $ и нажмите Tab.

Как задать глобальную переменную в Linux
Чтобы сделать переменную доступной для всех пользователей и сессий, добавьте её в /etc/environment. Это простой файл с парами ИМЯ=значение.
Пример редактирования:
sudo gedit /etc/environmentПравила записи:
- Формат: NAME=value без пробелов вокруг =.
- Если значение содержит пробелы, берите его в кавычки: NAME=”значение с пробелом”.
- Имя может содержать буквы, цифры и подчёркивания, но первый символ не должен быть цифрой.
После изменения выйдите/войдите в сеанс (или перезагрузите систему), чтобы изменения применились. Проверить можно так:
echo $WEBSITEГлобальная переменная будет доступна любому пользователю после его последующей авторизации.
Команды для просмотра всех переменных:
printenv | sort | lessДля фильтрации по теме:
printenv | grep GNOME
Полезные переменные Bash
Переменные, специфичные для bash, управляют поведением оболочки и часто автоматически обновляются:
- BASHOPTS — опции командной строки, с которыми был запущен bash.
- BASH_VERSION — версия bash в виде строки.
- BASH_VERSINFO — версия bash в виде массива/цифр.
- COLUMNS — текущая ширина терминала (в символах).
- DIRSTACK — стек директорий, управляемый pushd/popd.
- HISTFILESIZE — максимальное число записей в файле истории.
- HISTSIZE — размер истории в памяти.
- HOSTNAME — имя компьютера в сети.
- IFS — Internal Field Separator, разделитель полей по умолчанию (обычно пробел/таб/нова строка).
- PS1 — основной формат командной строки (prompt).
- PS2 — вторичный приглашение (ввод многострочных команд), по умолчанию “>”.
- SHELLOPTS — список включённых опций оболочки.
- UID — числовой идентификатор пользователя (0 для root).
Проверка нескольких переменных:
echo $BASH_VERSIONecho $HOSTNAMEecho $COLUMNSecho $HISTFILESIZEecho $UID
Токены, которые часто используют в PS1:
- \t — текущие время HH:MM:SS.
- \d — текущая дата (weekday month date).
- \n — символ новой строки.
- \s — имя оболочки.
- \W — имя текущей директории (basename).
- \w — путь текущей директории.
- \u — имя пользователя.
- \h — имя хоста.
- # — номер команды в текущей сессии (не то же, что в истории).
- \$ — $ для обычного пользователя, # для root (проверка UID).
Определение PS1 обычно хранится в ~/.bashrc.
Примечание: другие оболочки (zsh, fish) имеют свои переменные и форматы приглашения, но концепция схожа.
Как задать переменную Bash
Для переменных пользователя добавляйте определения в конец ~/.bashrc. Для переменных, которые должны быть доступны в удалённых SSH-сессиях, используйте ~/.bash_profile (или одновременно оба файла с разными значениями).
Открытие файла редактирования (пример):
gedit .bashrcПример записи:
export INHERITED_VAR="Value visible to child processes"
LOCAL_VAR="This session only"- export INHERITED_VAR — делает переменную частью окружения и она будет доступна дочерним процессам.
- LOCAL_VAR без export существует только в текущей оболочке.
Применение изменений без выхода/входа:
. .bashrcПрактический пример порядка действий и проверки:
LOCAL_VAR="This session only"
export INHERITED_VAR="Inherited value"
echo $LOCAL_VAR
echo $INHERITED_VAR
bash
echo $LOCAL_VAR
echo $INHERITED_VAR
exitВы увидите, что LOCAL_VAR пуст во вновь запущенном bash, а INHERITED_VAR доступна.
Сценарий для тестирования — envtest.sh:
#!/bin/bash
echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VARСделать исполняемым:
chmod +x envtest.shЗапуск покажет, какие переменные доступны скрипту (скрипт — дочерний процесс):
./envtest.shЕсли нужно, экспортируйте LOCAL_VAR и проверьте снова:
export LOCAL_VAR
./envtest.shУдалённые подключения
Глобальные переменные (из /etc/environment) видны при удалённом входе (ssh) автоматически. Локальные переменные пользователя станут видны при подключении по SSH, только если вы сохранили их в ~/.bash_profile (или другом файле, который читается при входе по SSH).
Короткая рекомендация:
- Для настроек, которые должны применяться при интерактивном входе по ssh — используйте ~/.bash_profile.
- Для интерактивных локальных сессий — ~/.bashrc.
- Если требуется одинаковое поведение и для локального, и для удалённого входа, поставьте чтение .bashrc из .bash_profile или дублируйте нужные export-записи.
Пример подключения и проверки:
ssh dave@howtogeek.local
./envtest.shЕсли .bash_profile содержит export INHERITED_VAR, скрипт увидит значение при ssh-подключении.
Удаление переменной окружения
Чтобы убрать переменную из текущей оболочки и её окружения, используйте unset:
unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITEВажное замечание: unset снимает переменную только в вашей текущей сессии. Другие логинившиеся пользователи по-прежнему имеют свои копии глобальных переменных, и их сеансы не изменятся.

Контроль окружения: зачем и как
Переменные окружения удобны для передачи настроек и конфигурации между скриптами и процессами без записи во временные файлы. Пример применения:
- Указать путь к исполняемым бинарникам/скриптам (PATH).
- Передать ключи конфигурации в контейнерах или временных процессах (в краткосрочной перспективе).
- Управлять поведением тестов и CI/CD через переменные окружения.
Однако переменные окружения не заменяют секрета-сейверы; не храните чувствительные данные в глобальных файлах без шифрования.
Таблица: команды и категории (перевод и пояснение)
| Linux команды | |
| Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc · tr |
| Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap |
| Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
Эта таблица — набор полезных утилит, с которыми часто взаимодействуют переменные окружения (PATH, конфигурационные файлы и т.д.).
Когда это не работает — частые ошибки и как их исправить
Вы добавили переменную в ~/.bashrc, но она недоступна при ssh-подключении.
- Причина: ssh-интерктивный вход читает ~/.bash_profile (или /etc/profile), а не ~/.bashrc.
- Решение: переместите экспорт в ~/.bash_profile или добавьте источник .bashrc из .bash_profile: if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Переменная не видна в дочернем процессе.
- Причина: вы не использовали export.
- Решение: export VAR=value
Изменили /etc/environment, но переменная не появилась сразу.
- Причина: файл читается при входе в систему.
- Решение: выйдите и войдите снова или перезапустите сессию.
Переменная содержит пробелы, но задана без кавычек.
- Причина: оболочка разбивает значение на слова.
- Решение: используйте кавычки: NAME=”значение с пробелом”.
Конфликт имён: локальная переменная перекрывает глобальную.
- Причина: в текущей сессии локальная переменная имеет приоритет.
- Решение: переименуйте или экспортируйте нужную переменную с корректным именем.
Переменная с секретом хардкодится в /etc/environment.
- Причина: плохая практика безопасности.
- Решение: храните секреты в специализированных хранилищах (Vault, секреты контейнера) и передавайте их в процессе запуска.
Альтернативные подходы
- Файлы конфигурации приложений: некоторые программы читают собственные .conf вместо переменных окружения — используйте их, если конфигурация сложная.
- Системные сервисы (systemd): переменные можно задавать в unit-файлах через Environment= и EnvironmentFile=, что удобно для сервисов.
- Docker/контейнеры: переменные окружения часто задаются через docker run -e или в docker-compose.yml, что обеспечивает явное и изолированное управление.
- Файлы .env: для приложений (особенно в разработке) удобно хранить переменные в .env и загружать их через dotenv-инструменты.
Когда выбирать альтернативу:
- Если конфигурация специфична для сервиса — используйте systemd unit или конфиг приложения.
- Если конфигурация для среды разработки — .env удобен и прост.
- Если нужно централизованное секретное хранение — выбирайте специализированные решения.
Мини-методология: как управлять переменными окружения в проекте
- Классификация: глобальные (системные), проектные (для приложения), временные (сессии).
- Секреты: никогда не храните чувствительные данные в /etc/environment или в репозитории.
- Документация: в README проекта перечислите переменные, что означают и какие обязательны.
- Шаблон: заведите файл .env.example с описанием переменных и допустимых значений.
- Развертывание: при деплое используйте менеджер конфигураций или CI/CD, который передаёт переменные в environment службы.
- Тестирование: добавьте тесты, проверяющие, что критичные переменные заданы и валидны.
Пример .env.example:
# .env.example
DATABASE_URL=postgres://user:pass@localhost:5432/dbname
PORT=8080
LOG_LEVEL=infoЧек-листы по ролям
Администратор:
- Проверьте /etc/environment на нежелательные секреты.
- Настройте systemd unit с EnvironmentFile для сервисов.
- Документируйте глобальные переменные.
- Используйте sudoedit для редактирования системных файлов.
Разработчик:
- Храните переменные проекта в .env (не в репозитории).
- Добавьте .env.example в репозиторий с описанием.
- При локальной разработке используйте direnv или dotenv для загрузки переменных.
- Экспортируйте переменные в тестовых окружениях через CI.
Оператор/DevOps:
- Интегрируйте секреты с Vault/SSM/KMS.
- В systemd указывайте EnvironmentFile и права доступа на файл.
- Автоматизируйте заполнение переменных через terraform/ansible.
Критерии приёмки
- Критично: приложение стартует и получает все обязательные переменные окружения.
- Проверка: envtest.sh показывает ожидаемые значения при запуске сервиса.
- Безопасность: ни одна секретная переменная не хранится в открытом виде в /etc/environment или репозитории.
- Документация: список переменных и их форматов должен быть в репозитории.
Security hardening (меры безопасности)
- Не храните пароли и ключи в /etc/environment или ~/.bashrc.
- Ограничьте права на файлы, содержащие переменные: chmod 600.
- Для сервисов systemd используйте EnvironmentFile с правами root и минимальными правами чтения.
- Рассмотрите использование менеджеров секретов (Vault, AWS Secrets Manager).
- Логирование: избегайте вывода секретных значений в логи и консоль.
Советы по миграции и совместимости
- Перенос /etc/environment между дистрибутивами обычно безопасен, но проверьте различия в системных путях.
- При переходе с bash на zsh проверьте, где zsh читает конфигурацию (~/.zshrc, ~/.zprofile).
- Для системd используйте EnvironmentFile и избегайте зависимости от интерактивных файлов (~/.bashrc).
Decision flow — куда записывать переменную (Mermaid)
flowchart TD
A[Нужно ли, чтобы переменная была системной?] -->|Да| B[/etc/environment]
A -->|Нет| C[Только для пользователя?]
C -->|Да| D[.bashrc или .profile]
C -->|Нет| E[Только для служб?]
E -->|Да| F[systemd unit: Environment/EnvironmentFile]
E -->|Нет| G[Контейнер/CI: передавать через конфиг/secret store](Схема помогает выбрать наилучшее место для хранения переменной в зависимости от контекста.)
1-строчная глоссарий
- export — команда, добавляющая переменную в окружение процесса; дочерние процессы наследуют её.
- PATH — список директорий для поиска исполняемых файлов.
- PS1 — формат командной строки (prompt).
- .bashrc — файл конфигурации интерактивной оболочки bash.
- .bash_profile — файл конфигурации при входе в систему (логин-shell).
Примеры использования в systemd
В unit-файле можно явно задать переменные:
[Service]
Environment="NODE_ENV=production"
EnvironmentFile=/etc/myapp/env
ExecStart=/usr/bin/node /opt/myapp/index.jsФайл /etc/myapp/env должен быть защищён и доступен только root.
Edge-case галерея (редкие сценарии и подсказки)
- Docker контейнеры: если CMD запускает shell, а вы выставляете переменные в образе через ENV, они видны внутри контейнера, но не на хосте.
- cron: среда выполнения cron ограничена; PATH и другие переменные могут отличаться. Всегда задавайте полные пути или явно экспортируйте необходимые переменные в crontab.
- sudo: sudo по умолчанию очищает окружение (env_reset). Используйте sudo -E для сохранения окружения или настройте /etc/sudoers (env_keep).
Тесты и приёмка — примеры тест-кейсов
- Тест 1: Перезапуск сессии после изменения /etc/environment приводит к появлению новой переменной.
- Тест 2: export VAR; bash; echo $VAR — значение должно отображаться в дочернем bash.
- Тест 3: Создать envtest.sh и проверить, какие переменные доступны скрипту.
- Тест 4: Добавить секрет в /etc/environment и проверить, что он не попал в публичный репозиторий.
Итог
Переменные окружения — простой и мощный инструмент управления настройками запускаемых процессов и приложений в Linux. Правильное место хранения переменной (системный файл, пользовательский профиль, systemd, контейнер) зависит от уровня доступа, требований безопасности и сценария использования. Следуйте базовым правилам: не храните секреты в открытом виде, экспортируйте переменные, когда хотите, чтобы их видели дочерние процессы, и документируйте структуру переменных для проекта.
Важно: используйте systemd EnvironmentFile или менеджеры секретов для production-сервисов, а .env и .bashrc — для разработки.
Дополнительно: приведённые примеры и чек-листы помогут выстроить процесс управления переменными окружения в вашей команде.
Похожие материалы
Группы LinkedIn: как эффективно использовать
Как скрыть дату рождения в LinkedIn
Показать или скрыть значок LinkedIn Premium
Как создать персональный бренд в LinkedIn
Как отвечать на предложения о работе в LinkedIn