«Command not found» в Ubuntu почти всегда означает не сломанную систему, а то, что нужная программа - это отдельный пакет, который ещё не установлен, а иногда и то, что apt update просто ни разу не запускали - разбираем оба случая, разницу между bash: command not found и E: Unable to locate package, и что делать, если бинарник вроде бы есть, а команда всё равно не находится.
Вы вводите команду из туториала, жмёте Enter - и вместо результата получаете bash: htop: command not found или что-то похожее. Первая мысль обычно «сервер сломан» или «я где-то ошибся с установкой». На деле в девяти случаях из десяти всё проще: команда живёт не сама по себе, а внутри пакета, который на этом сервере ещё не поставили. Разберём, что Ubuntu на самом деле имеет в виду под command not found, почему это сообщение путают с другим - Unable to locate package - и как быстро находить нужный пакет, даже если его имя не похоже на имя команды.
Коротко.
command not found- это ответ оболочки bash: она поискала исполняемый файл с таким именем в списке каталогов$PATHи не нашла. Если команда вам точно нужна - почти всегда её просто не установили:sudo apt update, затемsudo apt install <пакет>. Имя пакета не всегда совпадает с именем команды:ifconfigиnetstatживут в пакетеnet-tools,digиnslookup- вdnsutils,pip- вpython3-pip. Если apt сам пишетCommand 'X' not found, but can be installed with: sudo apt install X- это не ошибка, а подсказка от отдельного пакетаcommand-not-found, она угадывает не всегда. Другое, похожее по смыслу, но другое по причине сообщение -E: Unable to locate package- выдаёт самapt install, когда не знает такого пакета вообще: опечатка, либо не хватает репозитория, либо забылиapt update. Бинарник вроде бы есть, а всё равно not found - проверяйте$PATHчерезecho $PATHиwhich -a, а не переустанавливайте.
Что на самом деле значит «command not found»
На телефоне «приложения нет» и «приложение не установлено» - разные вещи. В Linux иначе: программа - это просто исполняемый файл, лежащий в одном из нескольких стандартных каталогов, и «команда» - это буквально имя этого файла. Когда вы набираете htop и жмёте Enter, командная оболочка (shell) - обычно это bash, программа, которая читает ваш ввод и запускает нужные процессы - перебирает каталоги из переменной окружения $PATH в заданном порядке и ищет в каждом файл с именем htop. Не нашла ни в одном - выводит bash: htop: command not found.
Посмотреть список каталогов, где ищет bash, можно так:
echo $PATH
Что вы увидите: строку вида /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games - каталоги через двоеточие. Bash проверяет их слева направо и берёт первое совпадение. Подкаталоги внутри них не заглядываются: если файл лежит в /opt/mytool/bin/tool, а этого пути нет в списке, команда tool не найдётся, даже если файл существует и исполняемый.
Отсюда следует важная вещь: «command not found» - это не «программы не существует в природе» и не обязательно «на сервере что-то сломано». Это буквально «файла с таким именем нет ни в одном из проверенных каталогов». Причин у этого три, и они разные по решению:
- программа не установлена вообще - самый частый случай на новом VPS;
- программа установлена, но лежит вне
$PATH, или сессия про неё ещё не знает; - обычная опечатка или неверный регистр - в Linux
Python3иpython3это два разных имени.
Самая частая причина на свежем VPS: пакет не установлен
Только что арендованный сервер - это минимальный набор программ, а не всё, что может понадобиться. Туториал говорит «выполните git clone ...», а git на сервере может просто не быть - это нормально, не брак установки. Программы в Ubuntu ставятся через apt - менеджер пакетов, который умеет находить готовую программу в репозитории, скачивать и настраивать её одной командой, вместо того чтобы собирать из исходников вручную.
Но перед установкой apt должен знать, что вообще существует и в какой версии. Этот список - локальный кэш репозиториев - обновляется отдельной командой:
sudo apt update
Зачем это перед каждой первой установкой. Список пакетов и их версий, который использует apt, скачан на сервер один раз - при создании образа - и с тех пор мог устареть или вовсе не соответствовать текущим репозиториям. apt update не устанавливает ничего сам - только обновляет список того, что доступно. Что вы увидите: несколько строк Get: и в конце что-то вроде Reading package lists... Done.
Дальше - сама установка нужного пакета:
sudo apt install htop
sudo- запускает команду с правами администратора; установка системных программ без этого не сработает, apt откажет с ошибкой о правах;- apt спросит подтверждение (
Y/n) и покажет, сколько места на диске займёт установка.
Что вы увидите: строки загрузки пакета, затем Setting up htop (...) ... и возврат приглашения командной строки без ошибок. После этого команда htop уже работает - можно проверить прямо так же, набрав htop ещё раз.
Вот как этот путь выглядит целиком на реальном сервере - от самой подсказки до рабочей команды (пример с unzip и ifconfig, чтобы наверняка показать пакет, которого точно нет по умолчанию):
«Command not found» и «Unable to locate package» - это разные сообщения
Начинающие часто путают два внешне похожих, но принципиально разных сообщения об ошибке. Первое - от bash, когда вы пытаетесь запустить команду. Второе - от apt, когда вы пытаетесь установить пакет. Они про разные вещи и лечатся по-разному.
Сообщение | Кто его выдаёт и когда | Что делать |
|---|---|---|
| Оболочка bash - в ответ на попытку запустить команду | Установить пакет, где лежит эта команда: |
| Сам | Проверить опечатку в имени, выполнить |
Разница на практике: если вы видите command not found, значит вы ещё даже не пытались ничего ставить - вы пытались запустить команду. Решение - найти правильный пакет и поставить его. Если вы видите Unable to locate package, значит вы уже дали команде apt install имя, которого apt не знает - либо оно написано неверно, либо для него нужен репозиторий, которого нет в текущем списке. Часто это одна и та же ситуация, увиденная с двух разных сторон: сначала htop не находится как команда, вы пробуете sudo apt install htop с опечаткой - и получаете уже второе сообщение, про пакет.
Имя команды и имя пакета - не всегда одно и то же
Если бы имя пакета всегда совпадало с именем команды, эта статья была бы короче. На деле у части базовых утилит - своё, отдельное название пакета, доставшееся с тех пор, как несколько похожих команд стали разносить по разным пакетам, чтобы не тащить лишнее на маленькие серверы. Вот частые несовпадения, с которыми сталкивается новичок при первой настройке VPS:
Команда, которую ищете | Пакет для установки | Комментарий |
|---|---|---|
|
| На большинстве облачных образов Ubuntu уже есть - от него зависит сам |
| | После установки команда обычно называется |
| | Старые сетевые утилиты. В современном Ubuntu их место чаще занимают |
| обычно уже установлен | Часть пакета |
| | Утилиты для ручных DNS-запросов, в базовую установку не входят. |
| | Своё название пакета, часто уже стоит на образах. |
| | Своё название пакета. |
| | Своё название пакета. |
| | Своё название пакета; для запаковки обратно - |
| | Своё название пакета. |
| | Один пакет-сборка ставит сразу компилятор, |
Если команды нет в этой таблице, поищите пакет по названию прямо в apt - иногда там подсказывает уже сам поиск:
apt search <название или часть названия>
Он ищет не только по именам пакетов, но и по описаниям, поэтому по слову вроде «ping» или «archive» нередко находится нужный пакет, даже если вы не угадали точное имя.
Ubuntu часто подсказывает пакет сама - это не ошибка, а отдельная функция
Если вы вводите команду, которой на сервере действительно нет, но которая существует в репозиториях, Ubuntu нередко пишет не сухое command not found, а развёрнутую подсказку:
Command 'htop' not found, but can be installed with:
sudo apt install htop
Это работает не силами bash, а благодаря отдельному пакету command-not-found: он перехватывает неудачный поиск команды и сверяется с базой данных, какие пакеты какие бинарники предоставляют. Удобно - можно скопировать готовую команду прямо из подсказки.
У этой функции есть границы, о которых стоит знать заранее:
- нужен установленный пакет
command-not-found- на некоторых минимальных или контейнерных образах его нет, и тогда вы получите просто голоеbash: htop: command not foundбез совета; - подсказка знает только о пакетах из подключённых репозиториев, включая
universeиmultiverse- если нужный пакет живёт в стороннем репозитории (PPA, репозиторий вендора), который вы ещё не добавили, подсказки не будет вообще; - для совсем нишевых утилит или опечаток вместо подсказки об установке вы иногда увидите
did you meanс похожими по написанию командами - это тот же механизм, но для другого случая.
Иначе говоря: если apt дал вам готовую команду для копирования - отлично, вставляйте и запускайте. Если просто написал command not found без подсказки - это не значит, что пакета не существует, значит только, что не сработала эвристика или сам пакет-подсказчик не установлен. Ищите руками через apt search или таблицу выше.
apt или apt-get - есть ли разница
apt и apt-get - это, по сути, две обёртки над одной и той же системой управления пакетами. apt-get появился раньше и остаётся стабильным по формату вывода - его поведение почти не меняется между версиями, поэтому его любят использовать в скриптах и Dockerfile, где важна предсказуемость. apt появился позже, как более дружелюбный интерфейс для человека за терминалом: у него есть индикатор прогресса, более читаемый вывод и разумные значения по умолчанию.
Для повседневных задач вроде обновления списка пакетов и установки программы разницы в результате нет - обе команды делают одно и то же. Практическое правило простое: набираете команду сами руками - берите apt, он удобнее читается. Пишете автоматизацию, скрипт, Dockerfile - используйте apt-get, его вывод стабильнее для парсинга и не меняется от версии к версии.
Софт не из стандартных репозиториев: PPA и сторонние источники
Иногда нужная версия программы вообще не входит в стандартные репозитории Ubuntu - например, конкретная версия базы данных или официальный репозиторий разработчика какого-то инструмента. Для таких случаев есть сторонние репозитории: их адрес добавляют в систему отдельно, а после этого apt начинает видеть пакеты оттуда наравне со стандартными.
На Ubuntu для этого часто используют PPA (Personal Package Archive - персональный архив пакетов, площадка для сторонних репозиториев конкретных разработчиков):
sudo add-apt-repository ppa:имя-владельца/имя-репозитория
sudo apt update
- после добавления любого нового репозитория обязательно нужен повторный
apt update- без него apt всё ещё не знает о новых пакетах, и вы снова получитеUnable to locate package; - команда
add-apt-repositoryсама по себе - из отдельного пакетаsoftware-properties-common, на некоторых минимальных образах его сначала нужно поставить:sudo apt install software-properties-common.
Осторожность здесь важнее удобства: добавляя чужой репозиторий, вы даёте его владельцу возможность поставить на ваш сервер что угодно под видом обновления пакета. Добавляйте только репозитории, адрес которых вы видите на официальном сайте нужного проекта или у известного вендора, а не первую ссылку из случайного форума.
Бинарник вроде бы есть, а команда всё равно не находится
Реже, но регулярно встречается другая ситуация: программу вы точно поставили (или собрали вручную), а Ubuntu по-прежнему пишет command not found. Обычно дело в одном из трёх:
1. Каталог программы не входит в $PATH. Частый случай - программа, установленная через pip install --user или собранная вручную, попадает в ~/.local/bin или /usr/local/bin, а эти каталоги не всегда добавлены в путь поиска для вашей сессии. Проверить:
echo $PATH
which -a <имя команды>
which -a в отличие от обычного which показывает не первое найденное совпадение, а все - полезно, если подозреваете, что установлены две версии программы и находится не та.
2. Bash запомнил старое расположение или сессия не обновилась. Bash кэширует, где именно лежит команда, чтобы не искать её заново каждый раз. Если вы только что установили программу в новом терминале - всё в порядке, а если ставили в этой же сессии и она всё равно не находится, сбросьте кэш:
hash -r
Либо просто откройте новую сессию SSH - она в любом случае перечитает $PATH заново.
3. Опечатка или другой регистр. Скучная, но реальная причина: в Linux регистр букв имеет значение, Python3 и python3 - разные имена, и пробел или лишний дефис ломает совпадение так же надёжно, как отсутствие самого файла.
Отдельный случай - команда работает без sudo, но не находится с sudo. Когда вы запускаете что-то через
sudo, оболочка ищет команду не в вашем обычном$PATH, а в отдельном, более коротком списке каталогов, заданном в настройкахsudo- так безопаснее: администратор не должен неожиданно исполнить программу из каталога, который может редактировать обычный пользователь. Программы, поставленные в~/.local/binчерезpip install --user, в этот короткий список почти никогда не попадают. Решение - указать полный путь к файлу (sudo /home/user/.local/bin/tool) или ставить системные утилиты штатно черезapt, а не в домашний каталог пользователя.
Snap - ещё один способ поставить программу
Часть туториалов вместо apt install предлагает команду вида:
sudo snap install <имя>
Snap - параллельная система установки программ в Ubuntu, где каждая программа поставляется вместе со своими зависимостями в отдельном изолированном контейнере, а не берёт их из общей системы. Это не замена apt и не однозначно лучший или худший вариант - просто другой путь к тому же результату, у которого свои плюсы (проще получить самую свежую версию программы) и минусы (чуть больше места на диске, более долгий первый запуск). Если туториал даёт команду через snap install, а не apt install - это не ошибка в инструкции, а осознанный выбор её автора, и обе команды приводят к рабочей программе.
Проверено на
Логика поиска команды через $PATH и разница между command not found и Unable to locate package не зависят от версии Ubuntu - это поведение bash и apt, устоявшееся много релизов назад. Конкретные имена пакетов из таблицы актуальны для Ubuntu 22.04 и 24.04; для более новых версий (в том числе 26.04, если она уже доступна в панели) стоит свериться отдельно - крупных изменений в переименовании базовых утилит на горизонте нет, но названия транзитных пакетов вроде dnsutils со временем меняют.
Частые вопросы
Ubuntu пишет command not found, что делать?
Сначала проверьте, нет ли опечатки в имени команды - Linux различает регистр букв. Если написано верно, скорее всего нужная программа просто не установлена: выполните sudo apt update, затем sudo apt install <пакет>, где имя пакета не всегда совпадает с именем команды (см. таблицу в статье). Если apt сам подсказал команду для установки строкой but can be installed with - просто скопируйте и выполните её.
Apt install Unable to locate package - что это значит?
Это сообщение от самого apt install, а не от bash: apt не нашёл пакета с таким именем ни в одном подключённом репозитории. Причины три - опечатка в имени пакета, список репозиториев устарел (нужен sudo apt update), либо пакет живёт в репозитории, который у вас не подключён вовсе (universe, multiverse или сторонний PPA).
Как понять, какой пакет установить, если команда не найдена?
Сначала посмотрите, не подсказал ли уже сам apt строкой Command 'X' not found, but can be installed with. Если подсказки нет, попробуйте поиск apt search <название> - он ищет и по описаниям пакетов, не только по точным именам. Для частых утилит вроде ifconfig, dig или pip проще свериться с готовой таблицей соответствий команда - пакет.
Чем apt отличается от apt-get?
Для повседневных задач - практически ничем: обе команды устанавливают, удаляют и обновляют пакеты одинаково. apt новее, удобнее читать глазами (прогресс-бар, более понятный вывод) и подходит, когда вы набираете команды сами. apt-get старше, его формат вывода стабильнее между версиями, поэтому его обычно оставляют в скриптах и Dockerfile, где важна предсказуемость, а не удобство чтения.
Почему ifconfig command not found в Ubuntu 24.04?
ifconfig относится к пакету net-tools, который в современных установках Ubuntu не ставится по умолчанию - его место в базовой поставке заняли более новые утилиты ip и ss из пакета iproute2. Если вам конкретно нужен ifconfig - например, так требует старый туториал - поставьте пакет явно: sudo apt install net-tools.
Почему python3 command not found в Ubuntu?
На большинстве официальных облачных образов Ubuntu python3 уже установлен, потому что от него зависит сам cloud-init - система, которая настраивает сервер при первом запуске. Отсутствие команды обычно встречается в контейнерах или сильно урезанных сборках. Лечится одинаково: sudo apt update, затем sudo apt install python3. Отдельно стоит помнить про pip: после установки python3-pip команда обычно называется pip3, а не голое pip.
Коротко
command not found- это bash, который не нашёл исполняемый файл с таким именем ни в одном из каталогов$PATH. Это не «программы не существует», а «файла с таким именем сейчас нет там, где ищут».Unable to locate package- совсем другое сообщение, отapt install: apt не знает такого пакета в подключённых репозиториях. Опечатка, устаревший список (sudo apt update) или не хватает репозитория.- Имя пакета не всегда совпадает с именем команды:
ifconfig/netstat- вnet-tools,dig/nslookup- вdnsutils,pip- вpython3-pip,make/gcc- вbuild-essential. - Подсказка apt
but can be installed with- настоящая функция пакетаcommand-not-found, но она не всесильна: не знает о сторонних репозиториях и может отсутствовать на минимальных образах. aptиapt-getдля повседневных задач равнозначны:apt- когда печатаете руками,apt-get- в скриптах.- Бинарник есть, а команда не находится - проверьте
$PATH(echo $PATH,which -a), сбросьте кэш bash (hash -r) или откройте новую сессию, а не переустанавливайте программу заново.
Что дальше
- Как перезапустить сеть в Ubuntu и Debian - если после установки сетевых утилит вроде
net-toolsилиdnsutilsоказалось, что дело было в самой сети. - Смена пароля в Ubuntu - когда команды находятся, но не хватает прав или доступа к серверу.
- Частые проблемы Linux-сервера - разбор остальных типовых сбоев на свежем VPS.
