No such file or directory в Termux: как найти причину и исправить ошибку

Команда в Termux возвращает bash: /data/data/com.termux/files/usr/bin/python: No such file or directory, хотя файл на месте, — это значит, что система не может найти либо сам исполняемый файл, либо интерпретатор, указанный в его первой строке. Ошибка обманчива: сообщение говорит про один путь, а реальная проблема часто скрывается в другом. Чаще всего виноваты опечатка в пути, битая ссылка, отсутствующий пакет или повреждённое окружение Termux.

В этой статье разберём, как отличить одну причину от другой, какие команды помогут локализовать проблему и как исправить ситуацию без переустановки приложения. Материал рассчитан на пользователей, которые уже базово работают в терминале, но столкнулись с неочевидным поведением оболочки.

Что на самом деле означает эта ошибка

Сообщение No such file or directory (в системных источниках — ошибка ENOENT) возвращается ядром, когда запрошенный путь не существует. В Termux она появляется в трёх типичных сценариях: при запуске несуществующей команды, при обращении к файлу по неверному пути и при выполнении скрипта, у которого в shebang-строке указан отсутствующий интерпретатор.

Третий случай — самый коварный. Скрипт лежит на месте, права на исполнение выставлены, но оболочка всё равно пишет, что файла нет. Дело в том, что ошибка относится не к скрипту, а к интерпретатору из первой строки вида #!/bin/bash. В Termux стандартных путей /bin и /usr/bin в привычном Linux-смысле нет — всё окружение живёт внутри /data/data/com.termux/files/usr, доступного через переменную $PREFIX.

Шаг 1: проверка существования файла и пути

Первое действие — убедиться, что файл реально существует по указанному адресу. Используйте команду ls с полным путём:

ls -l /data/data/com.termux/files/usr/bin/python

Если файл найден, обратите внимание на вывод: стрелка -> указывает на символическую ссылку. Битая ссылка — частая причина ошибки: сама ссылка есть, а цель, на которую она указывает, удалена. Проверить, куда ведёт ссылка, можно командой readlink -f путь.

  • 🔍 Проверьте путь посимвольно — регистр букв в Linux имеет значение, Script.sh и script.sh — разные файлы.
  • 📁 Убедитесь, что вы находитесь в нужном каталоге: команда pwd покажет текущее положение.
  • 🔗 Для символических ссылок проверьте целостность цели через ls -l и readlink.
  • ⌨️ Попробуйте автодополнение клавишей Tab — если оболочка не дополняет имя, файла с таким названием в каталоге нет.

Отдельный случай — работа с файлами из общего хранилища Android. Если скрипт лежит в /sdcard или /storage/emulated/0, запуск оттуда может завершаться ошибкой из-за ограничений файловой системы: раздел смонтирован с флагом noexec, и исполняемые файлы там не работают. Переместите скрипт в домашний каталог Termux командой cp и запускайте оттуда.

Шаг 2: диагностика shebang и запуск скриптов

Когда скрипт существует, но не запускается, посмотрите его первую строку командой head -1 имя_файла. Если там указано #!/bin/bash или #!/usr/bin/python, в Termux такого пути нет — отсюда и ошибка. Правильные варианты для Termux выглядят так:

#!/data/data/com.termux/files/usr/bin/bash

#!/data/data/com.termux/files/usr/bin/env python

Вариант с env предпочтительнее: он ищет интерпретатор в $PATH и работает переносимо. В Termux также есть утилита termux-fix-shebang, которая автоматически переписывает shebang-строки в указанном файле под окружение Termux:

termux-fix-shebang script.sh
⚠️ Внимание: если скрипт был создан или отредактирован на Windows, в нём могут остаться символы возврата каретки \r\n вместо Unix-переводов строк \n. Тогда shebang читается как #!/bin/bash\r, и система ищет интерпретатор с невидимым символом в имени. Лечится командой dos2unix файл или пересохранением файла в редакторе с LF-окончаниями строк.
Почему в Termux нет /bin и /usr/bin

Android не следует стандартной иерархии FHS. Termux работает в изолированном каталоге приложения /data/data/com.termux/files, и весь префикс окружения находится в подкаталоге usr. Поэтому скрипты, написанные для десктопного Linux, требуют адаптации путей.

Шаг 3: проверка установленных пакетов

Если ошибка возникает при запуске команды вроде python, node или git, вполне возможно, что соответствующий пакет просто не установлен или был повреждён. Проверить наличие пакета можно через менеджер пакетов:

dpkg -l | grep python

which python

Команда which показывает, какой именно файл будет запущен при вводе имени команды. Если она ничего не возвращает — исполняемого файла в $PATH нет. Установите пакет заново: pkg install python (или нужное вам имя пакета). Перед установкой полезно обновить индексы репозитория командой pkg update, чтобы избежать конфликтов версий зависимостей.

📊 Где чаще всего возникает ошибка No such file or directory у вас?
При запуске скриптов
При запуске установленных команд
При обращении к файлам в /sdcard
После обновления пакетов

Типовые причины и способы устранения

Сведём основные сценарии в таблицу — она поможет быстро сопоставить симптом с решением.

СимптомВероятная причинаРешение
Файл есть, но не запускаетсяНеверный shebangtermux-fix-shebang или правка первой строки
Файл есть, shebang верныйWindows-окончания строкdos2unix файл
Команда не найдена вообщеПакет не установленpkg install имя_пакета
Ссылка существует, цель — нетБитая символическая ссылкаПереустановка пакета-владельца
Запуск из /sdcard невозможенФлаг noexec на разделеКопирование в $HOME и запуск оттуда

Обратите внимание: конкретные имена пакетов и их зависимости могут меняться между версиями репозиториев Termux. Если pkg install сообщает, что пакет не найден, проверьте точное имя через pkg search ключевое_слово.

☑️ Диагностика ошибки за 5 шагов

Выполнено: 0 / 5

Восстановление повреждённого окружения

Иногда ошибка появляется массово: перестают запускаться сразу несколько команд, а ls показывает битые ссылки в $PREFIX/bin. Возможная причина — прерванное обновление пакетов или нехватка места во внутренней памяти во время установки. Начните с безопасных шагов: проверьте свободное место командой df -h $PREFIX и повторите обновление через pkg update && pkg upgrade.

Если окружение повреждено серьёзно, переустановите конкретные пакеты, чьи файлы отсутствуют. Полный сброс Termux (очистка данных приложения) — крайняя мера: она удаляет все установленные пакеты и файлы в домашнем каталоге. Перед этим скопируйте нужные данные в общее хранилище, например командой cp -r ~/важное /sdcard/ (при условии, что доступ к хранилищу уже выдан через termux-setup-storage).

⚠️ Внимание: не пытайтесь вручную создавать каталоги /bin или /usr/bin в корне устройства и не копируйте туда файлы без root-доступа и понимания последствий — это не решит проблему Termux и может нарушить работу системы Android.

Профилактика: как не столкнуться с ошибкой снова

Большинство случаев No such file or directory предотвращается простыми привычками. Пишите переносимые shebang-строки, не редактируйте скрипты в Windows-редакторах без настройки окончаний строк и не запускайте исполняемые файлы прямо из /sdcard. При установке сторонних скриптов из интернета первым делом прогоняйте их через termux-fix-shebang.

  • 🛠️ После каждого pkg upgrade проверяйте работоспособность ключевых команд.
  • 💾 Следите за свободным местом во внутренней памяти — нехватка пространства обрывает установку пакетов на середине.
  • 📦 Обновляйте пакеты только стабильным набором команд pkg update && pkg upgrade, не прерывая процесс.
  • 📝 Храните рабочие скрипты в $HOME, а не в общем хранилище Android.

Если ни один из шагов не помог, соберите диагностику: вывод ls -l по проблемному пути, содержимое первой строки скрипта и результат which для команды. С этими данными причину обычно удаётся определить за минуты.

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

Почему файл точно существует, но Termux пишет, что его нет?

Скорее всего, ошибка относится не к самому файлу, а к интерпретатору из его shebang-строки. Проверьте первую строку командой head -1 файл и исправьте путь на $PREFIX/bin/... или используйте termux-fix-shebang.

Можно ли запускать скрипты прямо из /sdcard?

Нет, раздел общего хранилища смонтирован с запретом исполнения. Скопируйте скрипт в домашний каталог Termux командой cp, выдайте права на исполнение chmod +x файл и запускайте оттуда.

Что делать, если ошибка появилась после обновления пакетов?

Проверьте свободное место командой df -h, затем повторите pkg update && pkg upgrade до чистого завершения. Если конкретная команда пропала — переустановите её пакет через pkg install.

Чем исправить скрипт, созданный на Windows?

Установите пакет dos2unix и выполните dos2unix имя_файла — это заменит Windows-окончания строк на Unix-формат, после чего shebang начнёт распознаваться корректно.

Поможет ли переустановка Termux?

Очистка данных приложения вернёт окружение к исходному состоянию и устранит любые повреждения, но удалит все пакеты и файлы в $HOME. Используйте это как последний вариант, предварительно скопировав нужные данные в /sdcard.