Ты установил программу. Точно установил — видел, как всё скачалось без единой ошибки. А терминал упрямо отвечает: command not found. Будто программы и нет вовсе. Знакомое чувство «да вот же она, я её только что поставил»?
Чтобы понять, что происходит, нужно познакомиться с одной невидимой штукой, которая работает за кулисами каждой твоей команды. Это переменные окружения, и главная из них — PATH. Звучит страшно, но по сути это просто записки, которые терминал держит под рукой.
Переменные окружения — это записки для терминала
Представь, что у терминала есть блокнот с заметками: «текущий пользователь — такой-то», «домашняя папка — вот тут», «язык — русский». Это и есть переменные окружения: пары «имя = значение», которые терминал помнит всё время, пока окно открыто.
Любая программа может в этот блокнот заглянуть. Например, по переменной HOME редактор понимает, куда сохранять твои настройки, а по LANG приложение решает, на каком языке с тобой говорить. Тебе не нужно ничего объяснять каждой программе отдельно — она сама подсматривает в общий блокнот.
Посмотреть все записки разом можно командой:
env
Список будет длинный — не пугайся, читать его целиком не надо. А заглянуть в одну конкретную переменную проще так:
echo $HOME
Значок $ перед именем означает «подставь сюда значение этой переменной». Терминал увидит $HOME и заменит его на путь к твоей домашней папке. Эта мелочь — $ — пригодится дальше.
PATH — список мест, где искать программы
А теперь — главная переменная, из-за которой ты сюда и пришёл. Когда ты пишешь git или claude и жмёшь Enter, терминал не обыскивает весь компьютер в поисках этой программы. Это было бы долго. Вместо этого он смотрит в переменную PATH — список папок, где живут программы, — и проверяет их по очереди.
Загляни в неё:
echo $PATH
Ты увидишь несколько путей, разделённых двоеточиями: /usr/local/bin:/usr/bin:/bin и так далее. Терминал читает их слева направо: «есть ли git в первой папке? нет. во второй? нет. в третьей? есть — запускаю». Как связка ключей: перебираешь по очереди, пока один не подойдёт к замку.
И вот тут вскрывается тайна command not found. Сообщение почти никогда не значит «программы нет на компьютере». Чаще оно значит «я искал её во всех папках из PATH и ни в одной не нашёл». Программа лежит на диске целая и невредимая — просто в папке, которой нет в этом списке. Терминал не телепат: где не велели смотреть, туда и не заглянет.
Понять это — половина дела. Раньше command not found выглядело как приговор: «сломал, переустанавливай». Теперь это всего лишь рапорт: «прошёлся по PATH, нужного файла не встретил». И почти всегда лечится одним из трёх движений — проверить написание команды, доустановить программу или добавить её папку в PATH. Какое именно нужно — подскажет здравый смысл: если имя редкое и хитрое, ты, скорее всего, опечатался; если только что качал установщик — он мог не дописать себя в список.
Совет
Если уверен, что программа установлена, а терминал её не видит, — почти всегда виноват PATH. Закрой терминал и открой заново: многие установщики дописывают свою папку в PATH, но эта правка подхватывается только в новом окне. Банальное «выключить и включить» здесь и правда лечит — не потому что магия, а потому что новое окно перечитывает список заново.
Как задать переменную на время
Иногда переменную нужно задать самому — например, программа просит ключ или особую настройку. Сделать это на один сеанс просто:
export API_KEY=secret123
Теперь, пока окно открыто, любая программа увидит API_KEY. Проверим:
echo $API_KEY
Слово export означает «сделай эту переменную видимой для программ, которые я запускаю». Без него переменная останется только в самом терминале и до программ не дойдёт — частая ловушка: задал ключ без export, программа его не увидела, а ты гадаешь, почему.
Такие подсказки через переменные встречаются на каждом шагу. Утилита просит токен — кладёшь его в export TOKEN=.... Скрипт хочет знать, в какой папке работать, — передаёшь путь переменной. Тебе не нужно лезть в код программы: ты просто оставляешь ей записку в общем блокноте, и она её читает.
Важно понять одно: это временно. Закроешь окно — записка сотрётся, как мел с доски. Откроешь новое — переменной там уже не будет. Это не баг, а удобство: можно спокойно экспериментировать с ключами и настройками, ничего не ломая навсегда. А чтобы переменная жила постоянно, её прописывают в специальный файл настроек, который терминал читает при каждом запуске. Но это уже следующий шаг — и спешить с ним новичку не нужно: на старте хватает и временных переменных.
Что стоит запомнить
Если выкинуть все подробности, останется простая картина:
- Переменные окружения — это общие записки терминала, пары «имя = значение».
PATH— список папок, где терминал ищет программы, по порядку.command not foundчаще значит «не нашёл в PATH», а не «не существует».export ИМЯ=значениезадаёт переменную на время — до закрытия окна.
Теперь command not found для тебя не глухая стена, а понятная подсказка: терминал прошёлся по списку и ничего не нашёл. Дальше дело техники — проверить написание, установить программу или перезапустить окно.
Хочешь разобраться с терминалом по-настоящему, шаг за шагом и без зубрёжки? В нашем бесплатном курсе ты тренируешься прямо в браузере — пишешь команды и сразу видишь результат.