Задать вопрос
Все статьи / VDS / Общая информация / Переменные окружения в Linux: управление, практика
Найти результаты:
Период:
с:
 
по:
Помощь в поиске

Помощь в поиске

apple banana
Найти записи, которые содержат хотя бы одно из двух слов.

+apple +juice
Найти записи, которые содержат оба слова.

+apple macintosh
Найти записи, которые содержат слово 'apple', но положение записей выше, если они также содержат 'macintosh'.

+apple -macintosh
Найти записи, которые содержат слово 'apple', но не 'macintosh'.

+apple ~macintosh
Найти записи, которые содержат слово 'apple', но если запись также содержит слово 'macintosh', rate it lower than if row does not. Это более "мягкий" чем поиск '+apple -macintosh', для которого наличие 'macintosh' вызывает что записи не будут возвращены вовсе.

+apple +(>turnover <strudel)
Найти записи, которые содержат слова 'apple' и 'turnover', или 'apple' и 'strudel' (в любом порядке), но ранг 'apple turnover' выше чем 'apple strudel'.

apple*
Найти записи, которые содержат такие слова как 'apple', 'apples', 'applesauce', или 'applet'.

"some words"
Найти записи, которые содержат точную фразу 'some words' (например записи содержащие 'some words of wisdom', но не "some noise words").

Переменные окружения в Linux: управление, практика

Переменные окружения – это один из тех инструментов, которые незаметно присутствуют почти в каждом современном приложении, но напрямую влияют на его стабильность, безопасность и удобство сопровождения. Но что это? И как с ними работать? Разбираемся в этом руководстве.

Что такое переменные окружения

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

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

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

Чаще всего через переменные окружения передают:

  • параметры подключения к базе данных и внешним сервисам;
  • ключи API и токены доступа;
  • флаги включения и отключения функций;
  • настройки логирования и уровня отладки;
  • параметры, зависящие от окружения – dev, staging, production.

Переменные окружения повышают безопасность, упрощают сопровождение проекта и снижают риск ошибок при развертывании приложения.

Типы переменных в командной оболочке

В Linux и macOS (и в целом в Unix-подобных системах) переменные обычно задаются в формате:

KEY=value
KEY="Some other value"
KEY=value1:value2

Чтобы переменные корректно читались оболочкой и приложениями, стоит придерживаться базовых правил:

  • имена переменных регистрозависимы – path и PATH будут разными значениями;
  • для переменных окружения чаще используют UPPER CASE, чтобы визуально отличать их от локальных переменных и не путать с внутренними параметрами скрипта;
  • несколько значений в одной переменной разделяют двоеточием : (классический пример – PATH);
  • пробелы вокруг = недопустимы: KEY=value, а не KEY = value;
  • если значение содержит пробелы или спецсимволы, его берут в кавычки.

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

Переменные окружения (environment variables) – это переменные, которые определены в текущей оболочке и наследуются дочерними процессами. То есть, если из терминала запускается приложение, оно получает доступ к этим значениям. Они нужны, чтобы передавать процессам настройки и параметры, не прописывая их в коде: режим работы, адреса сервисов, пути, токены, локали и другие данные, которые должны быть доступны за пределами одной сессии оболочки.

Переменные оболочки (shell variables) – это переменные, которые существуют только внутри текущей сессии оболочки и обычно не передаются дальше, если их специально не экспортировать. Они удобны для временных значений и служебных данных: переменные в скриптах, промежуточные результаты, текущие параметры выполнения команд. 

Просмотр переменных

Чтобы вывести все переменные окружения, используются стандартные команды:

printenv

или

env

Обе команды отображают список переменных, которые доступны текущему процессу и будут унаследованы дочерними процессами.

Если требуется посмотреть значение конкретной переменной, достаточно указать ее имя:

printenv <имя_переменной>

или воспользоваться выводом через оболочку:

echo $<имя_переменной>

Если нужно увидеть не только окружение, но и локальные переменные текущей оболочки:

set

Она выводит полный список переменных и функций, определенных в текущей сессии оболочки, что удобно при отладке скриптов.

В интерактивных оболочках также можно использовать автодополнение: начав ввод имени переменной с символа $и нажав Tab, оболочка подскажет доступные варианты.

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

Постоянные переменные

Постоянные переменные – это переменные окружения, которые сохраняются между сессиями: вы закрыли терминал, перезагрузили систему, а значения остались. В отличие от временных переменных, заданных только на время текущего сеанса, постоянные прописываются в файлах конфигурации или настройках системы.

В Linux существует несколько уровней задания постоянных переменных: пользовательский, системный и сервисный.

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

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

Основные файлы:

  • ~/.bashrc – выполняется при каждом запуске интерактивной Bash-сессии;
  • ~/.bash_profile – выполняется при логине пользователя;
  • ~/.profile – универсальный файл, используется разными оболочками.

Чаще всего переменные добавляют именно в ~/.bashrc, если они нужны в интерактивной работе, или в ~/.profile, если должны быть доступны сразу после входа в систему.

Пример:

export APP_ENV=production
export DEBUG=false
export PATH="$PATH:$HOME/bin"

Файл ~/.bashrc удобен для переменных, которые нужны в интерактивной работе, а ~/.profile – для глобальных пользовательских настроек. После изменения файла можно применить настройки:

source ~/.bashrc

Системные постоянные переменные

Системные переменные доступны всем пользователям и используются для глобальных настроек. Их следует задавать аккуратно, так как ошибки могут повлиять на работу всей системы.

Основные варианты:

  • /etc/environment. Простой файл формата KEY=value. Не поддерживает export, подстановки и сложную логику. Используется для базовых глобальных переменных.

APP_ENV=production
LANG=ru_RU.UTF-8

  • /etc/profile. Скрипт, выполняемый при входе пользователя в систему.
    Поддерживает shell-синтаксис, но редактировать его напрямую не рекомендуется.

  • /etc/profile.d/*.sh. Наиболее безопасный и удобный способ.
    Для каждой группы переменных создается отдельный файл.

Пример файла /etc/profile.d/myapp.sh:

export APP_ENV=production
export APP_LOG_LEVEL=info

Изменения вступают в силу после повторного входа пользователей или перезагрузки системы.

Постоянные переменные для сервисов и systemd

Сервисы, которые запущены через systemd, не наследуют пользовательское окружение. Для них переменные нужно задавать отдельно.

Наиболее распространенные способы:

  • директива Environment= в unit-файле;
  • подключение файла с переменными через EnvironmentFile=;
  • drop-in конфигурации в каталоге
    /etc/systemd/system/<service>.service.d/.

Пример drop-in файла:

[Service]
Environment=APP_ENV=production
Environment=LOG_LEVEL=info
EnvironmentFile=/etc/myapp.env

После изменений обязательно примените конфигурацию:

systemctl daemon-reload
systemctl restart myapp.service

Ключевые переменные

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

Основные системные и пользовательские переменные
 

Переменная

Назначение

Пример значения

PATH

Пути поиска исполняемых файлов

/usr/local/bin:/usr/bin:/bin

HOME

Домашний каталог пользователя

/home/alex

USER

Имя текущего пользователя

alex

LOGNAME

Логин пользователя

alex

SHELL

Используемая оболочка

/bin/bash

PWD

Текущий рабочий каталог

/home/alex/projects

OLDPWD

Предыдущий каталог

/home/alex

UID

Идентификатор пользователя

1000

HOSTNAME

Имя системы

server01

TERM

Тип терминала

xterm-256color


Переменные локализации и языка

Переменная

Назначение

Пример значения

LANG

Основная локаль системы

ru_RU.UTF-8

LC_ALL

Переопределение всех локалей

ru_RU.UTF-8

LC_TIME

Формат даты и времени

ru_RU.UTF-8

LC_NUMERIC

Формат чисел

ru_RU.UTF-8

LC_MESSAGES

Язык сообщений

ru_RU.UTF-8

LANGUAGE

Приоритет языков

ru:en

Переменные выполнения и загрузки программ

Переменная

Назначение

Пример значения

SHLVL

Уровень вложенности оболочки

1

_

Последняя выполненная команда

/usr/bin/env

LD_LIBRARY_PATH

Пути к динамическим библиотекам

/usr/local/lib:/usr/lib

LD_PRELOAD

Предзагружаемые библиотеки

/usr/lib/libjemalloc.so

Переменные для временных файлов и XDG-каталогов

Переменная

Назначение

Пример значения

TMPDIR

Каталог временных файлов

/tmp

TMP

Альтернативный путь для временных данных

/tmp

TEMP

Аналог TMP

/tmp

XDG_CACHE_HOME

Каталог пользовательского кэша

/home/alex/.cache

XDG_CONFIG_HOME

Каталог конфигураций

/home/alex/.config

XDG_DATA_HOME

Каталог пользовательских данных

/home/alex/.local/share

Переменные графической среды

Переменная

Назначение

Пример значения

DISPLAY

Адрес X-сервера

:0

WAYLAND_DISPLAY

Wayland-сокет

wayland-0

XAUTHORITY

Файл аутентификации X

/home/alex/.Xauthority

DESKTOP_SESSION

Графическая сессия

gnome

XDG_SESSION_TYPE

Тип сессии

wayland

Переменные, используемые приложениями

Переменная

Назначение

Пример значения

EDITOR

Текстовый редактор по умолчанию

nano

VISUAL

Графический редактор

code

PAGER

Постраничный просмотрщик

less

BROWSER

Браузер по умолчанию

firefox

MAIL

Почтовый ящик пользователя

/var/mail/alex

Переменные безопасности и администрирования

Переменная

Назначение

Пример значения

SUDO_USER

Пользователь, вызвавший sudo

alex

SUDO_UID

UID пользователя sudo

1000

SUDO_GID

GID пользователя sudo

1000

SSH_CLIENT

Информация о SSH-клиенте

192.168.1.10 51234 22

SSH_CONNECTION

Данные SSH-соединения

192.168.1.10 51234 192.168.1.5 22

SSH_TTY

Терминал SSH-сессии

/dev/pts/0

Удаление и сброс переменных 

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

Удаление переменной в текущей оболочке

Чтобы удалить переменную (окружения или оболочки) в текущей сессии, используется команда:

unset KEY

После этого переменная исчезнет из текущей сессии. Если открыть новый терминал, она может появиться снова – если задана в ~/.bashrc, ~/.profile, /etc/environment и т. п.

Проверить результат можно так:

echo $KEY
printenv KEY

Если ничего не вывелось – переменная не задана как переменная окружения.

Удаление постоянных переменных

Если переменная задана в файлах автозагрузки, она будет появляться снова при новом входе или запуске оболочки. Тогда нужно убрать ее из соответствующего файла.

Где обычно искать:

  • ~/.bashrc, ~/.profile, ~/.bash_profile – пользовательские настройки;
  • /etc/environment, /etc/profile, /etc/profile.d/*.sh – системные настройки.

Что делать:

  1. Открыть файл и удалить строку вида:

export KEY=value

  1. Применить изменения:

source ~/.bashrc

или просто перезайти в систему.

Сброс значения переменной

Если переменную нужно не удалить, а заменить ее значение, достаточно присвоить новое:

KEY=new_value

или, для переменной окружения:

export KEY=new_value

Временный сброс для одной команды

Иногда переменную нужно изменить или обнулить только для одного запуска программы:

KEY= <имя_команды>

или полностью убрать ее из окружения команды:

env -u KEY <имя_команды>

В этом случае глобальное окружение не изменяется.

Сброс переменных для systemd-сервисов

Для сервисов под управлением systemd переменные сбрасываются удалением директивы Environment= или строки в EnvironmentFile.

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

systemctl daemon-reload
systemctl restart service_name

Без этого изменения не вступят в силу.

Практические рекомендации

  1. Четко разделяйте области ответственности

Не смешивайте в одном месте разные типы переменных:

  • пользовательские – в ~/.profile или ~/.bashrc;
  • системные – в /etc/environment или /etc/profile.d/;
  • сервисные – в конфигурациях systemd.

Так проще понять, откуда берется значение и почему оно применяется.

  1. Используйте осмысленные и уникальные имена

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

Лучше применять префиксы, отражающие название приложения или проекта, например:

APP_ENV=production
APP_DEBUG=false
DB_HOST=localhost

Избегайте общих имен вроде ENV, CONFIG, DEBUG.

  1. Не храните секреты в открытых файлах

Секреты, такие как API-ключи, токены и пароли, ни в коем случае нельзя хранить в открытом виде в файлах. Правильнее всего:

  • не коммитить никакие секреты в репозиторий;
  • хранить конфиденциальные данные в отдельных файлах с ограниченными правами доступа, например, установив chmod 600, чтобы только владелец мог читать и писать;
  • использовать EnvironmentFile в сервисах systemd или аналогичные механизмы в контейнерах (например, Docker – env_file), чтобы загружать переменные окружения безопасно и автоматически.

В продакшн-средах это особенно критично: утечка одного токена может привести к компрометации всей инфраструктуры. 

  1. Не переопределяйте системные переменные без необходимости

Особенно чувствительны к изменениям переменные вроде PATH, LD_LIBRARY_PATH и LANG, поскольку они используются множеством программ для поиска исполняемых файлов, библиотек и настройки локализации.

Если нужно изменить PATH, дополняйте его, а не заменяйте:

export PATH="$PATH:/opt/myapp/bin"

  1. Используйте .env-файлы осознанно

Файлы .env удобны на этапе разработки – они позволяют хранить конфигурацию проекта в одном месте и быстро настраивать переменные окружения. Однако важно понимать, что это не системный стандарт, а соглашение, которое работает только если приложение или фреймворк явно загружает такой файл (например, через библиотеки вроде dotenv для Node.js, Python и других языков).

Используйте их как вспомогательный инструмент, а не универсальное решение.

  1. Минимизируйте количество переменных

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

  1. Документируйте используемые переменные

В каждом проекте должен быть понятный и актуальный список всех используемых переменных, включая:

  • имя переменной;
  • назначение;
  • пример значения;
  • обязательность.

Такую документацию удобно размещать в файле README.md, отдельном ENVIRONMENT.md или в шаблоне .env.example.

Заключение

Управление переменными окружения в Linux – это базовый, но крайне важный навык, напрямую влияющий на стабильность, безопасность и предсказуемость как отдельных приложений, так и всей системы. 

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

Предыдущая статья
Необходимые навыки для работы с VDS
Следующая статья
Плавающие IP-адреса для VPS