linux-labs

Вики / Базовые команды

Переменные окружения и 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: в скрипте

См. также