mksh
desarrollador aquí ☺
El problema de la distribución de binarios es que los binarios deben ser construidos contra el mismo bionic
libc como lo proporciona su teléfono, que necesita tanto los binarios libc (tal como se envían en su teléfono) como las cabeceras de desarrollo (sólo presentes en el árbol de fuentes de la AOSP de la persona que construyó su imagen).
Si desea utilizar un binario ARM mksh genérico en su lugar, puede utilizar uno compilado estáticamente contra otra libra (como musl
(recomendado), dietlibc
o klibc
). Sin embargo, estos Diferencia de comportamiento de la enviada por Android:
- Android tiene un diferente defecto
PATH
usando algo como /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
en lugar de /usr/bin:/bin
- Android ha diferentes directorios para
/etc
( /system/etc
), /tmp
( /data/local
), y las ubicaciones de ~/.mkshrc
y por defecto EXECSHELL
diferir
Por estas razones recomendaría mantener su /system/bin/sh
como es y sólo añadir un /system/bin/mksh
o incluso /vendor/bin/mksh
ejecutable con una versión más reciente si realmente lo necesitas y lo usas de forma explícita en los scripts y/o de forma interactiva.
Si vas a la Debian mksh
página del paquete puede descargar el paquete de Debian para su arquitectura ( arm64
para sistemas ARM de 64 bits, armhf
para ARMv7 de 32 bits o más reciente; es poco probable que necesites los más antiguos; 32 bits podría funcionar en sistemas de 64 bits pero no al revés), entonces una vez descargado en tu ordenador local, puedes extraer el paquete de la siguiente manera (usaré la versión de 32 bits para este ejemplo):
ar x mksh_57-2_armhf.deb
tar xaf data.tar.*
find usr/lib/ -name \*ksh -ls
El último comando listará todos los posibles binarios estáticamente enlazados contra no GNU-libc; para la versión 57-2, la salida es:
2633594 184 -rwxr-xr-x 1 user user 185584 Sep 26 00:52 usr/lib/arm-linux-musleabihf/bin/mksh
2633596 124 -rwxr-xr-x 1 user user 126816 Sep 26 00:52 usr/lib/klibc/bin/mksh
2633595 152 -rwxr-xr-x 1 user user 152716 Sep 26 00:52 usr/lib/diet/bin/mksh
Así que, puedes elegir cualquiera de estos tres binarios; realmente recomiendo usar el musl -compilado (es decir usr/lib/arm-linux-musleabihf/bin/mksh
el camino difiere para arm64
) ya que es la biblioteca C más correcta y completa.
adb push usr/lib/arm-linux-musleabihf/bin/mksh /sdcard/mksh-new
adb shell
su
mv /sdcard/mksh-new /vendor/bin/mksh
chown 0:0 /vendor/bin/mksh
chmod 555 /vendor/bin/mksh
Ahora, a menos que otro mksh
ejecutable está en el PATH
antes de /vendor/bin/
corriendo mksh script.sh
o simplemente mksh
(o mksh -l
para un shell de inicio de sesión) iniciará el nuevo binario (pero no leerá /system/etc/mkshrc
a menos que lo inicies como env ENV=/system/etc/mkshrc mksh
), pero el proceso de arranque del sistema seguirá usando la versión para la que fue diseñado y probado. (Más reciente mksh
las versiones pueden contener correcciones de errores que causan que los scripts que se basan en esos errores o en antiguas interpretaciones del estándar POSIX sh fallen).
Como también soy el desarrollador de Debian que mantiene el paquete mksh allí, puedes considerar esos paquetes como construcciones oficiales de Linux/ARM de las nuevas versiones de mksh (aunque sin las especificaciones de Android).
Si tú realmente necesitan un binario con los detalles de Android, puedo acceder a una caja de adaptación de Debian/ARM y compilar mksh desde la fuente, con las diferentes definiciones (como se indica arriba), manualmente y proporcionarlo para su descarga; contáctame (por eMail o IRC) si lo necesitas, ya que es un esfuerzo manual y me cuesta tiempo extra.