Гид по технологиям

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

12 min read Linux Обновлено 28 Dec 2025
Переменные окружения Linux — руководство
Переменные окружения Linux — руководство

Терминал Linux с открытой справкой man

Быстрые ссылки

  • Как работают переменные окружения
  • Наследование окружений
  • Глобальные переменные окружения
  • Как задать глобальную переменную в 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 $SHELL
echo $LANG
echo $HOME
echo $PWD

Совет: автодополнение работает и для имён переменных: наберите несколько букв после $ и нажмите Tab.

Вывод echo $SHELL в терминале

Как задать глобальную переменную в Linux

Чтобы сделать переменную доступной для всех пользователей и сессий, добавьте её в /etc/environment. Это простой файл с парами ИМЯ=значение.

Пример редактирования:

sudo gedit /etc/environment

Правила записи:

  • Формат: NAME=value без пробелов вокруг =.
  • Если значение содержит пробелы, берите его в кавычки: NAME=”значение с пробелом”.
  • Имя может содержать буквы, цифры и подчёркивания, но первый символ не должен быть цифрой.

После изменения выйдите/войдите в сеанс (или перезагрузите систему), чтобы изменения применились. Проверить можно так:

echo $WEBSITE

Глобальная переменная будет доступна любому пользователю после его последующей авторизации.

Команды для просмотра всех переменных:

printenv | sort | less

Для фильтрации по теме:

printenv | grep GNOME

Список переменных, отсортированный и показанный в less

Полезные переменные 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_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

echo $BASH_VERSION в терминале

Токены, которые часто используют в 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 снимает переменную только в вашей текущей сессии. Другие логинившиеся пользователи по-прежнему имеют свои копии глобальных переменных, и их сеансы не изменятся.

Снятие (unset) переменной окружения в Bash на Linux

Контроль окружения: зачем и как

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

  • Указать путь к исполняемым бинарникам/скриптам (PATH).
  • Передать ключи конфигурации в контейнерах или временных процессах (в краткосрочной перспективе).
  • Управлять поведением тестов и CI/CD через переменные окружения.

Однако переменные окружения не заменяют секрета-сейверы; не храните чувствительные данные в глобальных файлах без шифрования.

Таблица: команды и категории (перевод и пояснение)

Linux команды
Filestar · 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
Processesalias · 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
Networkingnetstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld

Эта таблица — набор полезных утилит, с которыми часто взаимодействуют переменные окружения (PATH, конфигурационные файлы и т.д.).

Когда это не работает — частые ошибки и как их исправить

  1. Вы добавили переменную в ~/.bashrc, но она недоступна при ssh-подключении.

    • Причина: ssh-интерктивный вход читает ~/.bash_profile (или /etc/profile), а не ~/.bashrc.
    • Решение: переместите экспорт в ~/.bash_profile или добавьте источник .bashrc из .bash_profile: if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
  2. Переменная не видна в дочернем процессе.

    • Причина: вы не использовали export.
    • Решение: export VAR=value
  3. Изменили /etc/environment, но переменная не появилась сразу.

    • Причина: файл читается при входе в систему.
    • Решение: выйдите и войдите снова или перезапустите сессию.
  4. Переменная содержит пробелы, но задана без кавычек.

    • Причина: оболочка разбивает значение на слова.
    • Решение: используйте кавычки: NAME=”значение с пробелом”.
  5. Конфликт имён: локальная переменная перекрывает глобальную.

    • Причина: в текущей сессии локальная переменная имеет приоритет.
    • Решение: переименуйте или экспортируйте нужную переменную с корректным именем.
  6. Переменная с секретом хардкодится в /etc/environment.

    • Причина: плохая практика безопасности.
    • Решение: храните секреты в специализированных хранилищах (Vault, секреты контейнера) и передавайте их в процессе запуска.

Альтернативные подходы

  • Файлы конфигурации приложений: некоторые программы читают собственные .conf вместо переменных окружения — используйте их, если конфигурация сложная.
  • Системные сервисы (systemd): переменные можно задавать в unit-файлах через Environment= и EnvironmentFile=, что удобно для сервисов.
  • Docker/контейнеры: переменные окружения часто задаются через docker run -e или в docker-compose.yml, что обеспечивает явное и изолированное управление.
  • Файлы .env: для приложений (особенно в разработке) удобно хранить переменные в .env и загружать их через dotenv-инструменты.

Когда выбирать альтернативу:

  • Если конфигурация специфична для сервиса — используйте systemd unit или конфиг приложения.
  • Если конфигурация для среды разработки — .env удобен и прост.
  • Если нужно централизованное секретное хранение — выбирайте специализированные решения.

Мини-методология: как управлять переменными окружения в проекте

  1. Классификация: глобальные (системные), проектные (для приложения), временные (сессии).
  2. Секреты: никогда не храните чувствительные данные в /etc/environment или в репозитории.
  3. Документация: в README проекта перечислите переменные, что означают и какие обязательны.
  4. Шаблон: заведите файл .env.example с описанием переменных и допустимых значений.
  5. Развертывание: при деплое используйте менеджер конфигураций или CI/CD, который передаёт переменные в environment службы.
  6. Тестирование: добавьте тесты, проверяющие, что критичные переменные заданы и валидны.

Пример .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 — для разработки.

Дополнительно: приведённые примеры и чек-листы помогут выстроить процесс управления переменными окружения в вашей команде.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Группы LinkedIn: как эффективно использовать
Социальные сети

Группы LinkedIn: как эффективно использовать

Как скрыть дату рождения в LinkedIn
Конфиденциальность

Как скрыть дату рождения в LinkedIn

Показать или скрыть значок LinkedIn Premium
Социальные сети

Показать или скрыть значок LinkedIn Premium

Как создать персональный бренд в LinkedIn
Личный бренд

Как создать персональный бренд в LinkedIn

Как отвечать на предложения о работе в LinkedIn
Карьера

Как отвечать на предложения о работе в LinkedIn

Как проверить работодателя при удалённой работе
Карьера

Как проверить работодателя при удалённой работе