Переменные окружения и PATH: откуда shell берёт настройки и команды
Переменные shell хранят состояние текущего интерпретатора, а экспортированные переменные образуют окружение дочернего процесса. PATH — одна из них: список каталогов, в которых shell ищет исполняемый файл по короткому имени.
Shell-переменная и окружение процесса
Присваивание без пробелов создаёт переменную текущего shell. Команда export помечает её для передачи будущим дочерним процессам. Уже запущенный процесс не получает последующие изменения родителя.
APP_MODE=development
sh -c 'printf "before export: <%s>\n" "$APP_MODE"'
export APP_MODE
sh -c 'printf "after export: <%s>\n" "$APP_MODE"'Секрет, помещённый в окружение, не становится зашифрованным: его может увидеть сам процесс, дочерние процессы и в некоторых конфигурациях другие средства диагностики. Значение нужно ограничивать по времени и области, например APP_MODE=test command передаёт переменную только одному запуску.
Как работает PATH
PATH содержит каталоги через двоеточие. При вызове tool shell последовательно ищет исполняемый файл в них. Встроенная команда type -a показывает, является имя alias, function, builtin или внешней программой; command -v подходит для проверки доступности в скрипте.
printf '%s\n' "$PATH" | tr ':' '\n'
type -a printf
command -v curlТекущий каталог обычно не входит в PATH, поэтому локальный файл запускают как ./script.sh. Добавление . в начало PATH опасно: злоумышленник или случайный файл с именем sudo, git или ls может перехватить вызов.
Конфигурационные файлы shell
Интерактивный Bash и login shell читают разные файлы. Изменение .bashrc не обязано влиять на неинтерактивный CI, systemd service или SSH-команду. Чтобы понять реальное окружение, проверяйте его в том же способе запуска: env | sort, pwd, id, command -v tool.
Ошибка и диагностика
Ошибка command not found не доказывает отсутствие пакета. Возможны неверный PATH, неисполняемый файл, другой пользователь или shell с очищенным окружением. Выполните type -a name, command -v name, проверьте printf '%s\n' "$PATH" и права найденного файла через ls -l. Не добавляйте неизвестный каталог в PATH до проверки владельца и содержимого.
Практика
Создайте в /tmp/path-demo/bin исполняемый скрипт hello-path, который печатает режим. Запустите его через полный путь, затем временно добавьте каталог в конец PATH и вызовите по имени. Передайте APP_MODE=practice только этому запуску и убедитесь, что после команды глобальное значение не изменилось.
Что важно запомнить
- Не каждая shell-переменная экспортируется; окружение копируется при запуске дочернего процесса.
- PATH задаёт порядок поиска и является частью границы доверия.
- Диагностировать окружение нужно в том же пользователе и способе запуска, где возник сбой.