command not found в bash и zsh: что значит и как исправить

опубликовано
читать
≈ 6 мин
автор
среда и версия
Debian 12 (bash 5.2, zsh 5.9, sudo) и Ubuntu 24.04 с пакетом command-not-found
содержание пройти тест Linux

command not found переводится как «команда не найдена». Оболочка не нашла программу с таким именем: ни среди своих встроенных команд, ни в каталогах из переменной PATH. Причин всего три: опечатка в имени, программа не установлена или установлена туда, где оболочка её не ищет. Сообщение выглядит по-разному:

  • bash: bash: docker: command not found;
  • zsh, в том числе в macOS: zsh: command not found: brew;
  • sudo: sudo: report: command not found;
  • Ubuntu сразу подсказывает пакет: Command 'tree' not found, but can be installed with: sudo apt install tree.

Ниже — как за минуту понять, какая из трёх причин твоя, и исправить её. Вывод снят на Debian 12 и Ubuntu 24.04.

Linux / 01

Где bash ищет команду

Где bash ищет командуBash ищет команду report по каталогам PATH слева направо: /usr/local/bin, /usr/bin, /bin, /usr/local/games, /usr/games, и ни в одном её нет. Итог — bash: report: command not found, код возврата 127. Сам файл лежит в /home/dev/tools/report, этого каталога в PATH нет. Исправление — export PATH="$HOME/tools:$PATH".bash ищет report по каталогам PATH слева направо/usr/local/binнет report/usr/binнет report/binнет report/usr/local/gamesнет report/usr/gamesнет reportreport: command not foundкод возврата 127файл лежит вне PATH/home/dev/tools/reportисправление — добавить каталог в PATH:export PATH="$HOME/tools:$PATH"
Bash не ищет программы по всему диску: только в каталогах PATH и по порядку. Файл в другом каталоге для него не существует, пока каталог не добавлен в PATH или не указан путь к файлу.

Сначала проверь, видит ли оболочка программу

command -v печатает путь к программе, если оболочка её находит, и молчит, если нет. type объясняет то же словами:

command -v git; type git; command -v docker; echo "код: $?"
/usr/bin/git
git is /usr/bin/git
код: 1

git найден в /usr/bin, docker — нет. Сама ошибка тоже оставляет след: код возврата 127, по нему её узнают в скриптах.

gti status; echo "код: $?"
bash: gti: command not found
код: 127

Опечатка

Первое, что стоит проверить, — имя: gti вместо git, pyhton вместо python3. Ubuntu с пакетом command-not-found сама предлагает похожие команды:

gti status
Command 'gti' not found, did you mean:
  command 'ti' from deb ticgit (1.0.2.17-2.1)
  command 'bti' from deb bti (034-6)
  command 'gmi' from deb lieer (1.6-2)
  command 'gtf' from deb xserver-xorg-core (2:21.1.12-1ubuntu1.6)
  command 'git' from deb git (1:2.43.0-1ubuntu7.3)
  command 'gt5' from deb gt5 (1.5.0~20111220+bzr29-4)
  command 'gth' from deb genomethreader (1.7.3+dfsg-8)
  command 'gsi' from deb gambc (4.9.3-1.2)
  command 'gtg' from deb gtg (0.6-5)
  command 'gt' from deb genometools (1.6.5+ds-2)
  command 'gri' from deb gri (2.12.27-1.1)
Try: sudo apt install <deb name>

Нужный вариант — git в середине списка: порядок подсказок от запуска к запуску меняется.

Отдельный частый случай — команда скопирована из инструкции вместе со знаком приглашения $:

$ ls -l
bash: $: command not found

Знак $ в документации показывает, что команду вводят в терминале. Копировать нужно то, что после него.

Программа не установлена

Docker, pip, tree и многие другие программы в свежей системе не стоят. Debian говорит об этом коротко:

bash: docker: command not found

Ubuntu подсказывает, каким пакетом поставить:

Command 'docker' not found, but can be installed with:
sudo apt install docker.io      # version 29.1.3-0ubuntu3~24.04.2, or
sudo apt install podman-docker  # version 4.9.3+ds1-1ubuntu0.2
Command 'pip' not found, but can be installed with:
sudo apt install python3-pip

Для Python есть ещё одна особенность: в Debian и Ubuntu нет команды python, только python3:

python --version
python3 --version
bash: python: command not found
Python 3.11.2

Пиши python3 или поставь пакет python-is-python3, который добавит привычное имя. Как установить Python и pip правильно, рассказано в статье про установку Python, а пакеты для проекта лучше ставить в виртуальное окружение.

sudo: command not found

В минимальной установке Debian, на сервере или в контейнере может не оказаться даже sudo:

sudo apt update
bash: sudo: command not found

Войди под root командой su - и поставь его: apt install sudo, затем usermod -aG sudo имя_пользователя и новый вход в систему. Дефис в su - важен: без него у root останется PATH обычного пользователя, и usermod тоже окажется «не найден». Почему так, объясняет следующий раздел. Подробнее о группах и sudo — в статье про пользователей и группы.

Программа есть, но лежит вне PATH

Если программа точно установлена, а оболочка её не видит, посмотри, где она ищет. Это список каталогов через двоеточие в переменной PATH:

echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Свой скрипт лежит в ~/tools, и по имени он не запускается, хотя по пути — пожалуйста:

report
./tools/report
bash: report: command not found
отчёт готов

Добавь каталог в начало PATH, не потеряв остальное, — $PATH в конце обязателен:

export PATH="$HOME/tools:$PATH"; report; command -v report
отчёт готов
/home/dev/tools/report

export действует до закрытия терминала. Чтобы настройка сохранилась, допиши ту же строку в ~/.bashrc (для zsh — в ~/.zshrc) и открой новый терминал:

echo 'export PATH="$HOME/tools:$PATH"' >> ~/.bashrc && tail -1 ~/.bashrc
export PATH="$HOME/tools:$PATH"

Каталог ~/.local/bin, куда ставят программы pipx, pip install --user и многие установщики, в Debian и Ubuntu добавляется в PATH сам — но только если он уже был, когда ты входил в систему. Это правило из ~/.profile:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

Если каталог появился после входа, программа из него станет видна после нового входа в систему. Как устроены переменные окружения и PATH, подробно разобрано в статье о переменных окружения.

Команды из /usr/sbin в Debian

В Debian обычному пользователю в PATH не входят каталоги /usr/sbin и /sbin, где лежат программы администрирования. Поэтому usermod, adduser, ufw и похожие для него «не найдены», хотя установлены:

usermod --help
ls -l /usr/sbin/usermod
bash: usermod: command not found
-rwxr-xr-x. 1 root root 147056 Dec 14  2025 /usr/sbin/usermod

Такие команды запускают через sudo — у него свой PATH, в котором /usr/sbin есть:

sudo usermod --help | head -1
Usage: usermod [options] LOGIN

sudo: команда не найдена

Обратная ситуация: команда работает, а с sudo — нет:

sudo report
sudo: report: command not found

sudo не берёт твой PATH. Он ищет программы в своём списке secure_path из /etc/sudoers:

Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Каталога ~/tools там нет. Передай sudo полный путь — его подставит command -v:

sudo "$(command -v report)"
отчёт готов

zsh и macOS: command not found: brew

В zsh, которая стоит по умолчанию в macOS, сообщение построено наоборот — имя команды в конце:

zsh: command not found: brew

Причины те же. Самая частая в macOS — только что установленный Homebrew. На компьютерах с Apple Silicon он ставится в /opt/homebrew, а этого каталога нет в PATH. Установщик в конце пишет, какие команды выполнить. Их смысл — добавить в ~/.zprofile строку eval "$(/opt/homebrew/bin/brew shellenv)" и открыть новый терминал.

Ошибки, на которых спотыкаются

PATH перезаписали, а не дополнили. Строка export PATH="$HOME/tools" без :$PATH в конце оставляет в PATH один каталог — и пропадают все остальные команды:

export PATH="$HOME/tools"; report; ls
отчёт готов
bash: ls: command not found

Если это случилось в текущем терминале, проще всего открыть новый. Если ошибка попала в ~/.bashrc, запусти редактор по полному пути — /usr/bin/nano ~/.bashrc — и исправь строку.

Поправили ~/.bashrc и ждут результата в том же окне. Файл читается при запуске оболочки. Открой новый терминал или выполни source ~/.bashrc.

Скрипт из текущего каталога запускают без ./. Текущий каталог в PATH не входит, поэтому script.sh — «не найден», а ./script.sh работает. Подробнее — в статье про bash-скрипты.

Ставят пакет, но не тот. Имя команды и имя пакета часто различаются: docker в Ubuntu ставится пакетом docker.io, pip — пакетом python3-pip. Подсказка Ubuntu называет пакет точно.

Частые вопросы

Как перевести command not found

«Команда не найдена». Оболочка не нашла программу с таким именем ни среди встроенных команд, ни в каталогах PATH.

Что значит код 127

Это код возврата, которым оболочка сообщает «команда не найдена». По нему ошибку ловят в скриптах и CI: например, шаг сборки упал с кодом 127 — значит, на машине сборки не установлена нужная программа.

Чем это отличается от «не является внутренней или внешней командой»

Ничем, кроме системы: так ту же ошибку пишет командная строка Windows. Причины те же — опечатка, программа не установлена или её каталога нет в PATH. Разбор для Windows, с PowerShell и папкой в PATH, — в статье «Не является внутренней или внешней командой».

Источники

Выжимки статей в Telegram: одна ловушка, код с выводом и ссылка на полный разбор. t.me/koddo_ru