Android ships with
mksh as shell, how can I upgrade to latest version (now R57, mine still on R43)?
Official site https://www.mirbsd.org/mksh.htm offers to compile from source, anyone building ready to run binaries?
mksh developer here ☺
The problem with distributing binaries is that the binaries need to be built against the exact same
bionic libc as your phone provides, which needs both the libc binaries (as shipped on your phone) and the development headers (only present in the AOSP source tree of the person who built your image).
If you wish to use a generic ARM mksh binary instead, you can use one statically compiled against another libc (such as
klibc). However, these will differ in behaviour from the one shipped by Android:
PATH, using something like
/data/local), and the locations of
For these reasons I’d recommend to keep your
/system/bin/sh as is and only add a
/system/bin/mksh or even
/vendor/bin/mksh executable with a newer version if you really need it and use that explicitly in scripts and/or interactively.
If you go to the Debian
mksh package page you can download the Debian package for your architecture (
arm64 for 64-bit ARM systems,
armhf for 32-bit ARMv7 or newer; it’s unlikely you’ll need older ones; 32-bit might work on 64-bit systems but not the other way round), then once downloaded to your local computer, you can extract the package as follows (I’ll use the 32-bit version for this example):
ar x mksh_57-2_armhf.deb tar xaf data.tar.* find usr/lib/ -name \*ksh -ls
The last command will list all possible statically-linked-against-not-GNU-libc binaries; for the version 57-2, the output is:
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
So, you can choose any of these three binaries; I really recommend using the musl-compiled one (that is
usr/lib/arm-linux-musleabihf/bin/mksh, the path differs for
arm64) as it’s the most correct and complete C library.
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
Now, unless another
mksh executable is in the
mksh script.sh or just
mksh -l for a login shell) will start the newer binary (but not read
/system/etc/mkshrc unless you start it as
env ENV=/system/etc/mkshrc mksh), but the system boot process will keep using the version it was designed for and tested with. (Newer
mksh versions may contain bugfixes that cause scripts relying on those bugs or older interpretations of the POSIX sh standard to fail.)
As I am also the Debian Developer maintaining the mksh package there, you can consider those packages as official Linux/ARM builds of newer mksh versions (although lacking the Android specifics).
If you really need a binary with the Android specifics, I can access a Debian/ARM porterbox and compile mksh from source, with the different definitions (as listed above), manually and provide it for downloading; contact me (by eMail or IRC) if you need that, as it’s manual effort and costs me extra time.