Сообщение ash: command not found или строка вида /bin/sh: ash: not found появляется в терминале, когда система пытается вызвать оболочку ash (Almquist Shell), но не находит её исполняемый файл по заданному пути. Чаще всего с этим сталкиваются пользователи Docker-контейнеров на базе Alpine Linux, встраиваемых систем с BusyBox и минимальных дистрибутивов, где набор установленных оболочек ограничен.
Ошибка относится к категории «команда не найдена» и почти всегда означает одно из трёх: оболочка ash не установлена в системе, путь к ней указан неверно, либо скрипт содержит шебанг #!/bin/ash, а файл по этому адресу отсутствует. Ниже разберём, как быстро определить конкретную причину и устранить её без переустановки системы.
Что такое ash и где она используется
Ash (Almquist Shell) — легковесная командная оболочка, совместимая с POSIX. Её основное назначение — минимальный расход памяти и быстрый запуск, поэтому она стала стандартом де-факто для встраиваемых систем и контейнеров. В BusyBox именно ash выполняет роль /bin/sh, а в Alpine Linux она является оболочкой по умолчанию.
В полноценных дистрибутивах вроде Ubuntu или Debian отдельного пакета ash обычно нет — вместо него используется dash, который тоже является потомком оригинальной Almquist Shell. Поэтому команда ash в таких системах действительно не найдена, и это нормальное поведение, а не поломка.
Типичные сценарии, где возникает ошибка:
- 🐳 запуск команды
docker exec -it container ashв образе, где ash не установлена; - 📜 выполнение скрипта с шебангом
#!/bin/ashв системе без этой оболочки; - 🔧 переход из Alpine-контейнера в Ubuntu-контейнер с сохранением привычных команд;
- 📦 повреждённая или урезанная сборка BusyBox на роутере или IoT-устройстве.
Быстрая диагностика: что именно не найдено
Прежде чем что-то устанавливать, определите, какой компонент отсутствует. Выполните в терминале несколько безопасных проверок — они ничего не меняют в системе:
which ash
ls -la /bin/ash
command -v ash
Если все три команды возвращают пустой результат или сообщение об отсутствии файла, оболочка в системе не установлена. Если файл существует, но команда всё равно «not found», проблема в переменной PATH или в битой символической ссылке.
Дополнительно проверьте, какие оболочки вообще доступны:
cat /etc/shells
echo $SHELL
ls /bin/*sh
Часто оказывается, что вместо ash можно сразу использовать sh, bash или dash — и никакой установки не потребуется.
Решение 1: использовать доступную оболочку
Самый простой вариант — заменить вызов ash на оболочку, которая уже есть в системе. В большинстве случаев скрипты, написанные для ash, корректно работают под dash или sh, поскольку все они следуют стандарту POSIX.
Для интерактивного входа в Docker-контейнер вместо docker exec -it mycontainer ash попробуйте:
docker exec -it mycontainer sh
Если ошибку выдаёт скрипт, откройте его в текстовом редакторе и измените первую строку с #!/bin/ash на #!/bin/sh. После этого проверьте запуск: если скрипт использует только POSIX-совместимые конструкции, он заработает без доработок.
⚠️ Внимание: если скрипт использует специфичные расширения (например, синтаксис bash-массивов), простая замена шебанга не поможет — проверьте код на совместимость или установите ту оболочку, под которую он написан.
Решение 2: установить ash или BusyBox
Если оболочка нужна именно как ash (например, её требует чужой скрипт или инструкция), установите её штатным пакетным менеджером. Команды зависят от дистрибутива:
| Система | Команда установки | Примечание |
|---|---|---|
| Alpine Linux | apk add busybox | Обычно уже предустановлена |
| Debian / Ubuntu | apt install busybox | Предоставляет ash как апплет BusyBox |
| Alpine (bash вместо ash) | apk add bash | Если скрипт требует bash |
| Debian (аналог ash) | apt install dash | POSIX-оболочка, уже есть в системе |
После установки проверьте результат командой ash --version или просто ash — должна открыться интерактивная сессия оболочки. В Docker-образах изменения вносятся в Dockerfile, а не в работающий контейнер: добавьте строку RUN apk add --no-cache busybox (для Alpine) и пересоберите образ.
☑️ Чек-лист устранения ошибки ash not found
Решение 3: исправить PATH и символические ссылки
Иногда оболочка установлена, но система её «не видит». Проверьте содержимое переменной PATH командой echo $PATH — в ней должны присутствовать стандартные каталоги /bin и /usr/bin. Если их нет, временно восстановите значение:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Другой вариант — битая символическая ссылка. В системах с BusyBox файл /bin/ash обычно является ссылкой на /bin/busybox. Если ссылка удалена или указывает в никуда, создайте её заново:
ln -sf /bin/busybox /bin/ash
⚠️ Внимание: командыln -sfи правка PATH выполняются от root или через sudo. Перед изменением системных ссылок убедитесь, что целевой файл/bin/busyboxдействительно существует и запускается.
Почему ошибка возникает в CI/CD пайплайнах
В CI-системах (GitLab CI, GitHub Actions) шаги часто выполняются внутри минимальных Docker-образов. Если в скрипте пайплайна указан shell: ash, а образ построен на Debian или scratch, оболочка не найдётся. Решение — явно указать доступную оболочку (sh или bash) в конфигурации пайплайна или перейти на образ на базе Alpine.
Ошибка «ash: имя_команды: not found» внутри оболочки
Отдельный случай — когда сообщение выглядит как ash: ping: not found или -ash: curl: not found. Здесь сама оболочка ash работает нормально, а не найдена команда, которую вы в ней запускаете. Это типично для Alpine-контейнеров, где базовый набор утилит минимален.
Порядок действий такой: определите, какой пакет предоставляет нужную утилиту, и установите его. В Alpine это делается через apk, например apk add curl. Если неизвестно, в каком пакете находится команда, поищите её в репозитории пакетов вашего дистрибутива.
Ключевой признак такого сценария: слово «ash» стоит в начале сообщения как имя оболочки, а «not found» относится к команде после двоеточия. Путая эти два случая, пользователи часто пытаются «установить ash», хотя она уже работает.
Профилактика в Docker-проектах
Чтобы ошибка не возникала повторно, зафиксируйте окружение на уровне образа. В Dockerfile явно указывайте установку нужных оболочек и утилит, а в скриптах используйте переносимый шебанг #!/bin/sh вместо привязки к конкретной реализации.
Также полезно документировать в репозитории, на каком базовом образе построен контейнер: знание того, что внутри Alpine, а не Debian, сразу объясняет отсутствие привычных команд и наличие ash вместо bash.
Частые вопросы
Чем ash отличается от bash?
Ash — минималистичная POSIX-оболочка без расширений bash (массивов, двойных скобок [[ ]], некоторых встроенных команд). Она потребляет меньше памяти и быстрее запускается, поэтому используется в Alpine и BusyBox. Большинство простых скриптов работают в обеих оболочках одинаково.
Почему в Ubuntu нет команды ash?
В Ubuntu и Debian роль лёгкой POSIX-оболочки выполняет dash, которая является потомком ash. Отдельный пакет ash там не нужен — используйте sh, dash или установите busybox, если требуется именно имя ash.
Как войти в Alpine-контейнер, если ash не найден?
Попробуйте docker exec -it имя_контейнера sh — в Alpine команда sh вызывает ту же оболочку. Если и это не сработает, образ может быть собран на базе scratch без оболочки вообще; тогда потребуется пересборка образа с добавлением busybox.
Опасно ли менять шебанг скрипта с #!/bin/ash на #!/bin/sh?
Для POSIX-совместимых скриптов это безопасно. Риск есть только если скрипт опирается на особенности конкретной реализации. После замены протестируйте скрипт на тестовых данных перед использованием в рабочей среде.
Что делать, если /bin/ash существует, но ошибка остаётся?
Проверьте, куда ведёт символическая ссылка (ls -la /bin/ash), исполняемый ли это файл, и содержит ли PATH каталог /bin. Также убедитесь, что сам BusyBox запускается: выполните /bin/busybox напрямую.