- Home »

Как читать и задавать переменные окружения и оболочки в Linux
Переменные окружения и оболочки в Linux — это основа основ для любого серверного администратора. Если вы когда-либо запускали скрипты, настраивали веб-серверы или просто пытались понять, почему ваше приложение не может найти нужные файлы, то вы обязательно сталкивались с переменными окружения. Они определяют поведение системы, передают конфигурационные данные между процессами и делают жизнь разработчиков намного проще. В этой статье мы разберём, как правильно читать, устанавливать и управлять переменными окружения, чтобы ваши серверы работали как часы.
Что такое переменные окружения и как они работают
Переменные окружения — это именованные значения, которые хранятся в памяти операционной системы и доступны для всех процессов. Они работают как глобальные настройки, которые могут влиять на поведение программ без необходимости изменения их кода.
Существует два основных типа переменных:
- Переменные окружения (Environment Variables) — наследуются дочерними процессами и доступны для всех программ
- Переменные оболочки (Shell Variables) — существуют только в рамках текущей сессии оболочки
Вот основные команды для работы с переменными:
# Просмотр всех переменных окружения
env
# Просмотр всех переменных (включая локальные)
set
# Просмотр конкретной переменной
echo $HOME
echo $PATH
# Установка локальной переменной
MY_VAR="hello world"
# Экспорт переменной в окружение
export MY_VAR="hello world"
# Удаление переменной
unset MY_VAR
Пошаговая настройка переменных окружения
Давайте разберём, как правильно устанавливать переменные для разных сценариев использования:
Временные переменные (на текущую сессию)
# Установка переменной только для текущей сессии
export DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
export NODE_ENV="production"
# Проверка установки
echo $DATABASE_URL
Постоянные переменные для пользователя
Добавьте переменные в файл ~/.bashrc
или ~/.bash_profile
:
# Редактирование файла
nano ~/.bashrc
# Добавьте в конец файла
export PATH="$PATH:/opt/myapp/bin"
export JAVA_HOME="/usr/lib/jvm/java-11-openjdk"
export EDITOR="vim"
# Перезагрузка конфигурации
source ~/.bashrc
Системные переменные для всех пользователей
# Создание файла в /etc/environment
sudo nano /etc/environment
# Добавьте переменные (без export!)
JAVA_HOME="/usr/lib/jvm/java-11-openjdk"
MAVEN_HOME="/opt/maven"
# Или через /etc/profile.d/
sudo nano /etc/profile.d/myapp.sh
# Добавьте с export
export MYAPP_HOME="/opt/myapp"
export PATH="$PATH:$MYAPP_HOME/bin"
Практические примеры и кейсы
Сценарий | Команда | Область действия | Рекомендации |
---|---|---|---|
Разработка | export DEBUG=true | Текущая сессия | Для временного включения отладки |
Продакшн | /etc/environment | Система | Для критичных системных настроек |
Пользователь | ~/.bashrc | Пользователь | Для персональных настроек |
Сервис | systemd unit файл | Сервис | Для изоляции переменных |
Пример настройки веб-сервера
# Создание файла окружения для приложения
sudo nano /etc/environment.d/webapp.conf
# Содержимое файла
DATABASE_URL=postgresql://webapp:secret@localhost:5432/webapp
REDIS_URL=redis://localhost:6379/0
SECRET_KEY=your-secret-key-here
NODE_ENV=production
# Для systemd сервиса
sudo nano /etc/systemd/system/webapp.service
[Unit]
Description=Web Application
After=network.target
[Service]
Type=simple
User=webapp
WorkingDirectory=/var/www/webapp
EnvironmentFile=/etc/environment.d/webapp.conf
ExecStart=/usr/bin/node app.js
Restart=always
[Install]
WantedBy=multi-user.target
Отрицательные примеры (чего НЕ делать)
# ПЛОХО: Хранение паролей в открытом виде
export DB_PASSWORD="secretpassword123"
# ХОРОШО: Использование файлов с ограниченными правами
# Создаём файл с переменными
sudo nano /etc/myapp/secrets.env
sudo chmod 600 /etc/myapp/secrets.env
sudo chown myapp:myapp /etc/myapp/secrets.env
# Загрузка переменных из файла
set -a
source /etc/myapp/secrets.env
set +a
Полезные команды для диагностики
# Поиск переменной по имени
env | grep -i path
# Сортировка переменных
env | sort
# Сравнение переменных в разных оболочках
bash -c 'echo $PATH'
zsh -c 'echo $PATH'
# Проверка, экспортирована ли переменная
declare -p MY_VAR
# Просмотр переменных конкретного процесса
cat /proc/PID/environ | tr '\0' '\n'
# Запуск команды с изменённым окружением
env -i PATH=/usr/bin:/bin ls -la
Автоматизация и скрипты
Переменные окружения открывают множество возможностей для автоматизации. Вот несколько практических примеров:
Скрипт для автоматической настройки окружения
#!/bin/bash
# setup-env.sh
# Проверка наличия переменной
if [ -z "$DATABASE_URL" ]; then
echo "ERROR: DATABASE_URL не установлена"
exit 1
fi
# Условное выполнение в зависимости от окружения
if [ "$NODE_ENV" = "development" ]; then
echo "Запуск в режиме разработки"
npm run dev
elif [ "$NODE_ENV" = "production" ]; then
echo "Запуск в продакшене"
npm start
else
echo "Неизвестное окружение: $NODE_ENV"
exit 1
fi
Динамическое создание конфигурационных файлов
#!/bin/bash
# generate-config.sh
# Шаблон конфигурации
cat > /etc/myapp/config.yaml << EOF
database:
url: ${DATABASE_URL}
pool_size: ${DB_POOL_SIZE:-10}
timeout: ${DB_TIMEOUT:-30}
redis:
url: ${REDIS_URL}
logging:
level: ${LOG_LEVEL:-info}
file: ${LOG_FILE:-/var/log/myapp.log}
EOF
Интеграция с Docker и контейнерами
При работе с контейнерами переменные окружения становятся ещё более важными:
# Dockerfile
FROM node:16
ENV NODE_ENV=production
ENV PORT=3000
WORKDIR /app
COPY . .
RUN npm install
EXPOSE $PORT
CMD ["node", "app.js"]
# docker-compose.yml
version: '3.8'
services:
webapp:
image: myapp:latest
environment:
- NODE_ENV=production
- DATABASE_URL=${DATABASE_URL}
env_file:
- .env
ports:
- "3000:3000"
Безопасность и лучшие практики
- Никогда не храните пароли в переменных окружения — они видны в
ps aux
и логах - Используйте файлы с ограниченными правами для чувствительных данных
- Очищайте переменные после использования с помощью
unset
- Используйте префиксы для переменных приложения (например,
MYAPP_DEBUG
) - Документируйте переменные и их значения по умолчанию
Если вы работаете с серверами и контейнерами, обязательно рассмотрите использование VPS или выделенного сервера для полного контроля над окружением.
Альтернативные инструменты
Помимо стандартных средств, существуют специализированные инструменты:
- direnv — автоматическая загрузка переменных при входе в директорию
- dotenv — библиотеки для различных языков программирования
- Vault — для управления секретами в продакшене
- Kubernetes ConfigMaps — для контейнерных окружений
# Установка direnv
sudo apt install direnv
# Настройка для bash
echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
# Создание .envrc в проекте
echo 'export DATABASE_URL="postgresql://localhost:5432/mydb"' > .envrc
direnv allow .
Интересные факты и нестандартные способы использования
Переменные окружения могут использоваться для неожиданных целей:
- Цветовые схемы терминала — переменная
LS_COLORS
управляет цветами вls
- Прокси-серверы —
HTTP_PROXY
иHTTPS_PROXY
для всех приложений - Локализация —
LANG
иLC_*
для языковых настроек - Отладка — многие программы поддерживают
DEBUG
переменную
# Примеры нестандартного использования
export GREP_COLOR='1;32' # Зелёный цвет для grep
export HISTSIZE=10000 # Увеличение истории команд
export EDITOR='code --wait' # VS Code как редактор по умолчанию
# Для разработчиков Python
export PYTHONPATH="${PYTHONPATH}:/path/to/my/modules"
export PYTHONDONTWRITEBYTECODE=1 # Отключение .pyc файлов
Мониторинг и отладка
Для диагностики проблем с переменными окружения полезны следующие техники:
# Логирование всех переменных при старте приложения
#!/bin/bash
echo "=== Environment Variables ===" >> /var/log/myapp.log
env | sort >> /var/log/myapp.log
echo "===========================" >> /var/log/myapp.log
# Проверка переменных в systemd сервисе
systemctl show myapp.service --property=Environment
# Отладка загрузки профиля
bash -x ~/.bashrc
# Проверка наследования переменных
bash -c 'echo "Parent: $MY_VAR"'
Заключение и рекомендации
Переменные окружения — это мощный инструмент для конфигурации и автоматизации серверов. Правильное их использование делает ваши приложения более гибкими, безопасными и удобными в обслуживании.
Основные рекомендации:
- Используйте
~/.bashrc
для персональных настроек - Применяйте
/etc/environment
для системных переменных - Изолируйте переменные сервисов через systemd unit файлы
- Никогда не храните пароли в переменных окружения
- Документируйте все используемые переменные
- Используйте инструменты вроде direnv для удобства разработки
Правильная работа с переменными окружения особенно важна при настройке серверов и развёртывании приложений. Это знание поможет вам создавать более надёжные и масштабируемые системы, которые легко конфигурировать и поддерживать.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.