С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Переменные окружения и PATH

3 мин bash

Переменные окружения: env, export, $PATH, ~/.bashrc и профили; откуда берётся «command not found».

Шпаргалка

6 команд Версия для печати
  • echo "$PATH" своё значение
  • env все переменные окружения
  • printenv HOME одну переменную
  • export VAR=value в текущую сессию + дочерние
  • VAR=value cmd только для команды
  • source ~/.bashrc перечитать без нового входа
  • постоянно: ~/.bashrc (терминал) · ~/.profile (login/SSH) · /etc/environment (системно)
  • systemd: Environment= / EnvironmentFile= ; cron: в скрипте

Обзор

Переменные окружения настраивают поведение программ. Самая важная — PATH (где искать исполняемые файлы).

bash
echo $PATH                        # где ищутся команды
env                               # все переменные окружения
printenv HOME                     # одну переменную
echo "$HOME $USER $SHELL"         # частые

Ключи

bash
export VAR=value                  # для текущей оболочки и ДОЧЕРНИХ процессов
VAR=value command                 # только для одной команды
unset VAR                         # удалить
export PATH="$PATH:/opt/bin"      # добавить каталог в конец PATH
export PATH="/opt/bin:$PATH"      # ...в начало (приоритетнее)
set                               # ВСЕ переменные shell (вкл. не-экспортированные)

Разница: переменная без export видна только текущей оболочке; с export — наследуется запускаемыми из неё процессами.

Рецепты

1

Где сохранять (login vs non-login)

Файл Когда читается
~/.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 файл (или .) перечитывает без нового входа.

Неполадки

5

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).

Термины

2
переменная окружения environment variable
Пара ИМЯ=значение в окружении процесса; дочерние процессы получают копию. В Bash переменную добавляют в окружение через export, окружение выводит env. Ещё встречается в: Docker, docker compose, Dockerfile, Bash-скрипты: запуск, переменные, аргументы и ещё 4
PATH
Переменная окружения со списком каталогов через двоеточие, в которых оболочка ищет команду, заданную без /. Какой файл будет запущен, показывает command -v или which. Ещё встречается в: which / type / whereis, hash, Bash-скрипты: запуск, переменные, аргументы, Dockerfile и ещё 24

См. также

  • files-basics — Навигация и файлы — ls, cd, cp, mv, rm, cat, less, head, tail, копипаст в терминале.
  • systemd — Init-система и менеджер служб (PID 1): юниты, цели, зависимости, журналы.
Загрузка…