Вики / Базовые команды
Переменные окружения и PATH
env, export, $PATH, ~/.bashrc vs профили; почему «command not found».
Переменные окружения настраивают поведение программ. Самая важная — PATH (где искать исполняемые файлы).
echo $PATH # где ищутся команды
env # все переменные окружения
printenv HOME # одну переменную
echo "$HOME $USER $SHELL" # частые
export VAR=value # для текущей оболочки и ДОЧЕРНИХ процессов
VAR=value command # только для одной команды
unset VAR # удалить
export PATH="$PATH:/opt/bin" # добавить каталог в конец PATH
export PATH="/opt/bin:$PATH" # ...в начало (приоритетнее)
set # ВСЕ переменные shell (вкл. не-экспортированные)
Разница: переменная без export видна только текущей оболочке; с export —
наследуется запускаемыми из неё процессами.
| Файл | Когда читается |
|---|---|
~/.bashrc |
интерактивные не-login оболочки (новый терминал/таб) |
~/.profile / ~/.bash_profile |
login-оболочки (вход по SSH/в консоль) |
/etc/profile, /etc/profile.d/*.sh |
системно для login-оболочек |
/etc/environment |
системно для всех (простые KEY=value, без export) |
Тонкость: вход по SSH — это login-shell (читает ~/.profile), а новый терминал в уже
открытой сессии — non-login (читает ~/.bashrc). Поэтому Ubuntu в ~/.profile
подключает ~/.bashrc. source файл (или .) перечитывает без нового входа.
command not found, хотя бинарник есть
Его каталог не в $PATH. Проверь echo $PATH; добавь каталог или зови по полному
пути. Для свежеустановленного — иногда hash -r (сброс кэша путей) или новый shell.
export сработал, но в новом терминале пропал
export живёт только в текущей сессии. Для постоянства — пропиши в ~/.bashrc
(терминалы) или ~/.profile (login), затем source или перелогинься.
Переменная есть в терминале, но не по SSH (или наоборот)
Разные файлы для login/non-login (см. таблицу). По SSH читается ~/.profile, а ты
прописал в ~/.bashrc — перенеси или подключи одно из другого.
Скрипт/cron/systemd не видит переменную
cron и systemd-юниты не читают твой ~/.bashrc. Задавай явно: в юните
Environment=/EnvironmentFile=, в cron — в самом скрипте или crontab.
sudo «теряет» переменные
sudo очищает окружение (env_reset). Передать: sudo -E cmd (если разрешено) или
sudo VAR=val cmd (см. sudo).
echo "$PATH" ; env ; printenv VAR
export VAR=value # в текущую сессию + дочерние
VAR=value cmd # только для команды
source ~/.bashrc # перечитать без нового входа
# постоянно: ~/.bashrc (терминал) · ~/.profile (login/SSH) · /etc/environment (системно)
# systemd: Environment= / EnvironmentFile= ; cron: в скрипте
См. также
- Базовые команды с файлами — Базовые команды
- systemd — Службы и systemd