Переменные, PATH и .env
Почти любая ошибка установки заканчивается фразой «проверь PATH». А пароли к базам и ключи к облаку инструменты читают из переменных окружения. Разберёмся, как это работает.
Переменные shell
Заголовок раздела «Переменные shell»NAME=Mariaecho "Привет, $NAME"- Присваивание — через
=, без пробелов.NAME = Maria— ошибка. - Прочитать значение — через
$:$NAME.
Переменные окружения и export
Заголовок раздела «Переменные окружения и export»Обычная переменная живёт только внутри текущего shell. Программы, которые вы запускаете, её не видят.
Переменная окружения передаётся во все программы, которые запускает shell. Обычную переменную превращает в переменную окружения export:
export DB_HOST=warehouse.example.comenv | grep DB_ # все переменные окружения, которые начинаются с DB_Инструменты данных берут настройки из окружения: AWS_PROFILE, DBT_PROFILES_DIR, SNOWFLAKE_ACCOUNT, DATABASE_URL, ключи API для AI-агентов.
Встроенные переменные:
| Переменная | Что в ней |
|---|---|
HOME | Домашняя папка |
USER | Имя пользователя |
SHELL | Какой shell запущен |
PATH | Где shell ищет команды |
PATH — как 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".bashrc и .zshrc — настройки навсегда
Заголовок раздела «.bashrc и .zshrc — настройки навсегда»Всё, что вы задали в терминале, пропадает, когда вы его закрываете. Чтобы настройка осталась, её пишут в файл, который shell читает при старте:
~/.zshrc— для zsh (macOS).~/.bashrc— для bash (Linux, WSL, Git Bash).
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrcsource ~/.zshrc # перечитать файл в текущем терминалеТам же задают алиасы — короткие имена для длинных команд:
alias ll='ls -la'Файлы .env
Заголовок раздела «Файлы .env»Пароли не пишут в код. Их кладут в файл .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.
Задание 1
Заголовок раздела «Задание 1»Сколько папок в вашем PATH? Выведите их по одной на строку: замените : на перевод строки командой tr ':' '\n'.
Проверка: список папок, по одной на строку. Число зависит от компьютера. Обычно от 5 до 20.
Решение
echo $PATH | tr ':' '\n'echo $PATH | tr ':' '\n' | wc -lЗадание 2
Заголовок раздела «Задание 2»Где лежат программы ls и bash?
Проверка: например, /bin/ls и /bin/bash. В Git Bash — /usr/bin/ls и /usr/bin/bash.
Решение
which lswhich bashЗадание 3
Заголовок раздела «Задание 3»Прочитайте config/app.env через source и выведите DB_HOST. Потом проверьте, видит ли переменную другая программа: bash -c 'echo host=$DB_HOST' запускает новый bash.
Проверка: первая команда печатает warehouse.example.com. Вторая — host= с пустым значением: переменная не экспортирована.
Решение
source config/app.envecho $DB_HOSTbash -c 'echo host=$DB_HOST'Задание 4
Заголовок раздела «Задание 4»Сделайте так, чтобы новый 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 +abash -c 'echo host=$DB_HOST'env | grep ^DB_^ в grep значит «в начале строки».
Задание 5
Заголовок раздела «Задание 5»Выведите $DB_USER в одинарных и в двойных кавычках. В чём разница?
Проверка: в одинарных — $DB_USER, в двойных — analyst.
Решение
echo '$DB_USER'echo "$DB_USER"Задание 6
Заголовок раздела «Задание 6»Сделайте алиас ll для ls -la и сохраните его навсегда. Откройте новое окно терминала и проверьте.
Проверка: в новом окне ll показывает файлы со скрытыми, подробно.
Решение
macOS (zsh):
echo "alias ll='ls -la'" >> ~/.zshrcGit Bash, WSL, Linux (bash):
echo "alias ll='ls -la'" >> ~/.bashrcДальше: Права, скрипты и архивы.