Если вы когда-либо работали с Android через ADB или терминальные приложения, наверняка сталкивались с ограничениями встроенной оболочки. В отличие от десктопных дистрибутивов Linux, здесь всё устроено иначе – и понимание этого сэкономит вам время при настройке устройств или разработке под платформу.
В основе Android лежит модифицированная версия ядра Linux, но пользовательское пространство существенно отличается. Система по умолчанию включает только один shell-интерпретатор – mksh (MirBSD Korn Shell), который находится по пути /system/bin/sh. Это не классический Bourne shell (кстати, оригинальный код Bourne устарел ещё в 90-х), а современная реализация с поддержкой функций из Korn shell. Его выбрали за компактность, соответствие POSIX-стандартам и лицензию BSD, что критично для открытой экосистемы Android.
Как проверить текущую оболочку и её возможности
Подключившись к устройству через ADB или запустив терминальное приложение, выполните:
echo $SHELL
which sh
sh --version
В выводе вы увидите путь /system/bin/sh и информацию о версии mksh. Например:
mksh @(#)MIRBSD KSH R57 2020/02/02
Важно: не путайте эту оболочку с bash
или zsh
– их нет в AOSP по умолчанию. Попытки вызвать bash
без предварительной установки приведут к ошибке «command not found».
Почему в Android нет других shell?
Причин несколько:
- Минимализм. AOSP оптимизирован для работы на устройствах с ограниченными ресурсами. Даже mksh занимает всего ~200 КБ в сжатом виде.
- Безопасность. Каждый дополнительный компонент – потенциальная уязвимость. Ограничение до одной оболочки снижает поверхность атак.
- Лицензирование. mksh распространяется под лицензией BSD, которая совместима с Apache 2.0 (основной для Android), в отличие от GPL-лицензий некоторых других оболочек.
Как добавить bash, zsh или fish
Если функциональности mksh недостаточно, есть три варианта:
1. Установка через Termux. Этот эмулятор терминала предоставляет собственное окружение с пакетным менеджером. После установки из Google Play выполните:
pkg install bash
Теперь bash
будет доступен внутри Termux, но не системно.
2. Ручная загрузка бинарников. Скомпилируйте выбранный shell для архитектуры ARM/AArch64, затем скопируйте его в /system/bin
(требуются root-права). Пример для bash:
adb push bash /system/bin/
adb shell chmod 755 /system/bin/bash
Учитывайте, что это может нарушить целостность системы (особенно на устройствах с Verified Boot).
3. Кастомные прошивки. Например, LineageOS иногда включает дополнительные утилиты. Проверяйте документацию конкретной сборки.
Особенности mksh: что умеет и чего не хватает
По сравнению с bash, mksh проще, но для базовых задач его хватает. Вот что стоит знать:
- Поддерживает автодополнение через Tab, но не подсвечивает синтаксис.
- Нет алиасов по умолчанию (их можно добавить вручную в
~/.mkshrc
). - Работает с массивами и арифметическими операциями:
arr=(1 2 3)
echo $(( arr[0] + 5 )) # вернёт 6 - Не поддерживает
declare -A
для ассоциативных массивов (в отличие от bash 4+).
Чтобы сделать работу комфортнее, создайте файл настроек:
adb shell "echo 'alias ll="ls -l""' > /data/local/.mkshrc""
Теперь при каждом запуске sh будет загружать этот конфиг.
Частые проблемы и решения
Проблема: После установки bash команда не распознаётся.
Решение: Убедитесь, что бинарник имеет права на выполнение (chmod +x) и находится в одном из каталогов $PATH. Проверьте переменную:
echo $PATH
Проблема: Скрипты, написанные для bash, не работают.
Решение: В первой строке скрипта укажите явный путь к интерпретатору:
#!/system/bin/sh
Или, если используете bash из Termux:
#!/data/data/com.termux/files/usr/bin/bash
Проблема: Ошибка «Permission denied» при попытке записи в /system.
Решение: Remount раздел в режиме чтения-записи (требуется root):
adb root
adb remount
В заключение: хотя mksh может показаться ограниченным, он полностью покрывает потребности системных скриптов Android. Для интерактивной работы я рекомендую Termux – он даёт полноценное окружение без вмешательства в системные разделы. Если же хочется экспериментов, пробуйте кастомные прошивки, но всегда делайте бэкапы данных.