Перейти к содержимому
TelegramGitHub

Переменные, PATH и .env

Почти любая ошибка установки заканчивается фразой «проверь PATH». А пароли к базам и ключи к облаку инструменты читают из переменных окружения. Разберёмся, как это работает.

Окно терминала
NAME=Maria
echo "Привет, $NAME"
  • Присваивание — через =, без пробелов. NAME = Maria — ошибка.
  • Прочитать значение — через $: $NAME.

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

Переменная окружения передаётся во все программы, которые запускает shell. Обычную переменную превращает в переменную окружения export:

Окно терминала
export DB_HOST=warehouse.example.com
env | grep DB_ # все переменные окружения, которые начинаются с DB_

Инструменты данных берут настройки из окружения: AWS_PROFILE, DBT_PROFILES_DIR, SNOWFLAKE_ACCOUNT, DATABASE_URL, ключи API для AI-агентов.

Встроенные переменные:

ПеременнаяЧто в ней
HOMEДомашняя папка
USERИмя пользователя
SHELLКакой shell запущен
PATHГде shell ищет команды

Когда вы пишете python, shell не знает, где лежит эта программа. Он смотрит папки из PATH по порядку и запускает первую найденную.

Окно терминала
echo $PATH
/usr/local/bin:/usr/bin:/bin

Папки разделены двоеточием. Если программа лежит в папке, которой нет в PATH, вы увидите command not found.

Окно терминала
which python3 # какой файл запустится на самом деле
which duckdb

Добавить папку в PATH:

Окно терминала
export PATH="$HOME/.local/bin:$PATH"

Всё, что вы задали в терминале, пропадает, когда вы его закрываете. Чтобы настройка осталась, её пишут в файл, который shell читает при старте:

  • ~/.zshrc — для zsh (macOS).
  • ~/.bashrc — для bash (Linux, WSL, Git Bash).
Окно терминала
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc # перечитать файл в текущем терминале

Там же задают алиасы — короткие имена для длинных команд:

Окно терминала
alias ll='ls -la'

Пароли не пишут в код. Их кладут в файл .env рядом с проектом:

Окно терминала
cat config/app.env

Прочитать файл в текущий shell — source. Чтобы все переменные из файла сразу стали переменными окружения, используют set -a:

Окно терминала
set -a; source config/app.env; set +a
  • Двойные кавычки "..." — переменные внутри подставляются: echo "$HOME" → /home/maria.
  • Одинарные кавычки '...' — всё как написано: echo '$HOME' → $HOME.

Все задания — в папке ~/cli-practice.

Сколько папок в вашем PATH? Выведите их по одной на строку: замените : на перевод строки командой tr ':' '\n'.

Проверка: список папок, по одной на строку. Число зависит от компьютера. Обычно от 5 до 20.

Решение
Окно терминала
echo $PATH | tr ':' '\n'
echo $PATH | tr ':' '\n' | wc -l

Где лежат программы ls и bash?

Проверка: например, /bin/ls и /bin/bash. В Git Bash — /usr/bin/ls и /usr/bin/bash.

Решение
Окно терминала
which ls
which bash

Прочитайте config/app.env через source и выведите DB_HOST. Потом проверьте, видит ли переменную другая программа: bash -c 'echo host=$DB_HOST' запускает новый bash.

Проверка: первая команда печатает warehouse.example.com. Вторая — host= с пустым значением: переменная не экспортирована.

Решение
Окно терминала
source config/app.env
echo $DB_HOST
bash -c 'echo host=$DB_HOST'

Сделайте так, чтобы новый bash тоже видел DB_HOST. Потом выведите все переменные окружения, которые начинаются с DB_.

Проверка: host=warehouse.example.com. В списке пять переменных: DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USER.

Решение
Окно терминала
set -a; source config/app.env; set +a
bash -c 'echo host=$DB_HOST'
env | grep ^DB_

^ в grep значит «в начале строки».

Выведите $DB_USER в одинарных и в двойных кавычках. В чём разница?

Проверка: в одинарных — $DB_USER, в двойных — analyst.

Решение
Окно терминала
echo '$DB_USER'
echo "$DB_USER"

Сделайте алиас ll для ls -la и сохраните его навсегда. Откройте новое окно терминала и проверьте.

Проверка: в новом окне ll показывает файлы со скрытыми, подробно.

Решение

macOS (zsh):

Окно терминала
echo "alias ll='ls -la'" >> ~/.zshrc

Git Bash, WSL, Linux (bash):

Окно терминала
echo "alias ll='ls -la'" >> ~/.bashrc

Дальше: Права, скрипты и архивы.