Table of Contents
- Introduction and Licence
- Documentation and Support (IRC, manual page, mailing lists, RSS feeds, …)
- Installation
- Upgrade your packages from older mksh
- Inclusion in operating systems
- comparision with other shells
- Testsuite Results (regression tests)
- on version numbers – for packagers
- future plans
- ChangeLog
- information about old versions
mksh(1) R39b
This is the website of the MirBSD™ Korn Shell, an actively developed free implementation of the Korn Shell programming language and a successor to the Public Domain Korn Shell (pdksh).
|
This page is always accessible via a redirection at http://mirbsd.de/mksh, which is the canonical homepage URI, and in case the webserver is unreachable, the backup page will provide basic information. The FSF/UNESCO directory of Free Software lists mksh, too. There also is an mksh project page on ohlol, a statistics site. Get the Logo (SVG). |
Introduction
The current version of mksh is mksh R39b from 29 January 2010.
Thanks to “Der Verein trash.net” for sponsoring access to a Solaris 8 box. Thanks to HP TestDrive/PvP, which helps in keeping mksh portable to several Unixes and compilers, and track down some architecture- or glibc-specific bugs. Thanks to Julian “yofuh” Wiesener for just another account on a Sun E420 on Solaris 11β. Thanks to someone who prefers to stay anonymous due to tons of red tape for providing access to an AIX 5.3 system with gcc and xlC installed. Thanks to gnubber’s admin (Barry “bddebian” deFreese), as well as Samuel “youpi” Thibault, for providing shell access to a Debian GNU/Hurd system. Thanks to Lucas “laffer1” Holt for ssh access to the MidnightBSD server. Thanks to Waldemar “wbx” Brodkorb for dropping his unused Zaurus SL-C3200 to someone who can actually make use of it to test mksh on OpenBSD. Thanks to Andreas “gecko2” Gockel for access to a couple of Debian and Macintosh boxen and an iPhone 3G. Thanks to Martin Zobel-Helas for an account on an Alpha system. Thanks to Bastian “waldi” Blank for access to an S/390 system and uploading mksh packages to Debian for quite some time. Also thanks to Otavio Salvador and Patrick “aptituz” Schönfeld for uploading a couple of my Debian packages. The Debian GNU/k*BSD and Hurd developers were quite helpful in assisting and testing as well. Thanks to Thomas E. “TGEN” Spanjaard for access to both a NetBSD and a DragonFly system. Thanks to Josef “jupp” / “penpen” Schugt for testing mksh on a Digital Unix (OSF/1 V4.0) system from the Uni Bonn Physik CIP Pool. Thanks to DEChengst from #UnixNL for providing access to a HP/Compaq Tru64 (OSF/1 V5.1B) system, an OSF/1 V2.0 system and an Ultrix 4.5 system. Thanks to Adam “replaced” Hoka for a BSDi BSD/OS 3.1 ISO9660 image and offering to help with HP-sUX testing (now that HP TestDrive went down) and porting to Haiku. Thanks to André “naaina” Wösten for ssh on a QNX box. Thanks to Olivier Duchateau for testing on Slackware and Zenwalk GNU/Linux. (Did I miss anyone? Mail me if so. Some of these are past, anyway.)
What is mksh(1)? – Short answer: The MirBSD Korn Shell. Okay, but what exactly does it do, or why another shell? These questions will be answered here for the people interested. Right now, you only need to know that mksh is a DFSG-free and OSD-compliant (and OSI approved) successor to pdksh, developed as part of the MirOS Project as native Bourne/POSIX/korn shell for MirOS BSD, but also to be readily available under other UNIX®-like operating systems.
The source code for mksh is available at the MirOS Project mirrors
as well as these of other operating system projects due to being included in these; however, we do not provide binaries.
Find instructions to build and install mksh below, or
ask your operating environment vendor to package and include mksh; we provide
assistance for this task if asked. Licencing permits this as long
as due credit is given to the authors and contributors and the copyright
notices are not removed in their entirety; modifying is allowed (but if
the result is still called mksh, it’s discouraged; talk with us if you
feel you have to modify mksh). The individual licences used are the MirOS
licence, and (for BSD compatibility on other oerating systems) the 3-clause
UCB licence and the ISC licence; full
terms are available. pdksh originally was public domain, with a few
exceptions, but these files are not part of mksh R21 or up. The mksh(1) author
(mirabilos) acknowledges the contributions of these people who dedicated pdksh
and oksh to the public, and asserts a collective copyright on the code.
All these licences are DFSG clean and conform to the OSD, and the MirOS
Licence is listed on the pages of the ifrOSS licence centre as well as
in the FSF/UNESCO Directory of Free Software. The MirBSD Korn Shell is OSI Certified
and its manual Open Knowledge.
To compile mksh, you will need a Bourne or POSIX shell (Solaris
/bin/sh is enough, and the Z shell should work), a C compiler (at
the moment, only the one from the GNU Compiler
Collection works, but we’re attempting to change this), system and C
library header files and the standard C runtime. You will also need a set of
standard UNIX® tools on a supported operating system: any recent BSD; Darwin,
Apple Mac OSX; Interix (Microsoft® Services for Unix 3.5, maybe Subsystem for
Unix Applications on Win2003/Vista); GNU/Cygwin; UWIN; GNU/Linux (libc5,
glibc, dietlibc, µClibc, some klibc systems are tested), Debian GNU/kFreeBSD,
GNU/Hurd or GNU/Linux; Sun Solaris (8, 9, 10, 11), OpenSolaris; AIX; IRIX;
HP-UX 11i; OSF/1; ULTRIX; Minix 3
To run the
regression test suite, you will need a not too antiquated Perl with POSIX.pm
as well as /bin/ed (whose installation is
strongly suggested anyway, because it’s the standard FCEDIT history
editor and standard UNIX® text editor), as well as a controlling terminal,
usually /dev/tty or provided from script(1) or GNU screen.
To use mksh, you only need the C runtime (and any supplemental libraries the binary was linked against) and, optionally, /bin/ed – for interactive use, a controlling terminal is highly recommended because job control does not work without one.
To make full use of mksh(1)’s interactive features, it is recommended to copy the dot.mkshrc file from the source distribution as ~/.mkshrc into the user’s home directory and let the user adjust it to suit his needs. The sample file configures a few aliases and shell functions as well as a sensible prompt ($PS1) and some csh-like directory stack functions and zsh-like hooks. Full use of this file requires a few special UNIX® tools. Note that $ENV must not be set for mksh(1) to parse the ~/.mkshrc file at startup.
Support
We provide an online manual page in HTML and PDF format. Reading books about Korn Shells in general is recommended as further help, but beware of the differences to other shells. Some ISBNs are listed at the end of the manual page.
The RSS feed collects news and wlog entries regarding mksh.
If you require additional assistance or want to discuss bugs, features or enhancements, write to the mailing list (or subscribe to it). The mailing list can be reached via NNTP or at the MARC web archive (or GMane Loom) as well. Joining the IRC channel at Freenode (irc.freenode.net:6667) #!/bin/mksh (no joke, this is really the channel’s name) and #ksh (where you must distinguish AT&T ksh from mksh though) is recommended as well.
Installation
Skip to the section about being included in operating environments unless you really want to compile mksh from source yourself or create a package for your operating system of choice.
First off, you have to download the source code from any of the mirrors listed below, or any other mirror you know of. Official source code distributions are a cpio(1) compressed “old-style” (portable octal) archive, compressed with gzip(1) (zlib’s deflate algorithm) and digitally signed with gzsig(1) using the MirOS Project’s current signature key. Please verify the signature as well as the hashes and/or checksums below, so you’re sure the content is intact and the version number on the archive is correct. If you require source code in tar(1)’s “ustar” format, check the Debian Project for availability, although they often do not carry the latest version. The pax(1) utility (the POSIX Archiver) can extract from the CPIO distfile and is available even on a stock Microsoft® Windows® installation (\WINNT\SYSTEM32\PAX.EXE).
Known Mirrors
- https://www.mirbsd.org/MirOS/dist/mir/mksh/mksh-R39.cpio.gz
- http://pub.allbsd.org/MirOS/dist/mir/mksh/mksh-R39.cpio.gz
Checksums and Hashes
- RMD160 (mksh-R39b.cpio.gz) = 5f7a5ff75700b229f0886521a069de46001e6a8e
- TIGER (mksh-R39b.cpio.gz) = 6436c46a99467389966bae3fec5434be21cfd76245e13fa8
- 2720723829 294189 /MirOS/dist/mir/mksh/mksh-R39b.cpio.gz
- MD5 (mksh-R39b.cpio.gz) = 91274beff2be95260a51234d2c7bb4f7
- All official distfiles are gzsig(1)d.
Decompression
Use any of the following syntaxes to extract the distfile; you’ll get the idea soon. Some web browsers (prominently, Mozilla® and its derivates as well as Microsoft® Internet Explorer®) already inflate the distfile during download but do not remove the “.gz” extension; replace “gzip -dc” (gzcat) with “cat” if that happens for you.
The first example is using BSD paxtar (MirOS BSD, OpenBSD, NetBSD®), or “bsdtar” (DragonFly); the second and third use cpio(1) or pax(1) and are for most operating systems; the fourth is for Debian.
- $ tar xzf mksh-R39.cpio.gz && cd mksh
- $ gzip -dc mksh-R39.cpio.gz | cpio -mid && cd mksh
- $ gzip -dc mksh-R39.cpio.gz | pax -r && cd mksh
Compilation
Now you’re in the source code directory; Build.sh does all the
magic for you. In theory, invoking the command
% /bin/sh ./Build.sh
should work. Relative paths can be used too, for example, instead of cd(1)ing
to the source directory, you could’ve done
% mkdir build; cd build; /bin/sh ../mksh/Build.sh
The build script requires a Bourne shell (Solaris /bin/sh, the Heirloom sh, DEC OSF/1
V2.0 /bin/sh), Korn shell (ksh, ksh88, ksh93, pdksh, mksh, oksh,
maybe the MKS ksh), POSIX shell (posh, /usr/xpg4/bin/sh, ash,
dash), related shell (J�rg Schilling’s bsh or sh, the Z Shell), or a Bourne
or POSIX superset (such as GNU bash) to work; the ULTRIX /bin/sh
or the C shell (csh, tcsh) or “bsh” or a scripting shell like the wish won’t.
Accepted arguments are:
- -combine – all-in-one build, recommended unless gcc is broken; ignored if $CC does not support “-fwhole-program --combine” (gcc4, R37+)
- -j – parallel build (mksh R31d and up)
- -llvm[=…] – compile to bytecode; option arguments (or, if none given, ‘-std-compile-opts’) are passed to LLVM opt (mksh R36b and up)
- -M – instead of compiling, create Makefrag.inc (R39b+)
- -Q – be (only) a little less verbose
- -r – don’t try to build a pre-formatted version of the manual page using nroff(1) if found – recommended
Note on -combine vs -j vs -llvm vs -M: these four are mutually exclusive. The least preferred of the three actually compiling flavours is -j, and the one we consider best is -combine (since it achieves the best optimisations). It is sometimes possible to use -j together with -llvm to parallelise LLVM Bytecode generation, though.
The build script also honours the following environment variables:
- CC (gcc) – the C compiler used
- CFLAGS (-O2 / -xO2; on HP-UX/IA64 also -mlp64 / +DD64) – optimiser and other compiler flags used
- CPPFLAGS (no default) – additional cpp(1) flags
- LDFLAGS (set on AIX for libcrypt) – additional CCLD flags
- LIBS (-lcrypt on Interix; empty otherwise) – additional libraries to pull in
- NOWARN (-Wno-error / -errwarn=%none) – $CC option to disable bailing out at errors; used during mirtoconf checks
- NROFF (nroff; “nroff -c” with GNU groff) – the manual page processor used unless -r is given
- TARGET_OS (uname -s || uname) – the operating system to compile for; set this during cross compilation; valid: AIX BeOS (not yet) BSD/OS CYGWIN* Darwin DragonFly FreeBSD GNU (Hurd) GNU/kFreeBSD Haiku (not yet) HP-UX Interix IRIX* Linux MidnightBSD Minix MirBSD NetBSD OpenBSD OSF1 Plan9 (not yet) PW32* (not yet) QNX SunOS syllable (not yet) ULTRIX UWIN*
- TARGET_OSREV (uname -r) – the operating system revision number for these that need it; currently: QNX (R38c+)
- Feature selectors:
- USE_PRINTF_BUILTIN=1 – add printf.c to the list of files to be compiled and set a flag so it is used as builtin (R39+)
If CPPFLAGS contain any of the following definitions, the resulting binary will be compiled with a specific flavour:
- -DMKSH_SMALL – build a really small mksh(1), e.g. for embedded systems (see below for details of what this entails)
- -DMKSH_ASSUME_UTF8=0 – do not use setlocale(3) or nl_langinfo(CODESET); do not assume the terminal is in UTF-8 mode (mksh R38c and up)
- -DMKSH_ASSUME_UTF8 – do not use setlocale(3) or nl_langinfo(CODESET); assume the terminal is always in UTF-8 mode
- -DMKSH_BINSHREDUCED – include code to automatically “set -o posix” (mksh R39b+: “set -o sh”) to reduce functionality if called as sh or -sh
- -DMKSH_CLS_STRING – the string to send to the terminal to clear the window (default: "\033[;H\033[J")
- -DMKSH_CONSERVATIVE_FDS – use less filedescriptors (32/10 ipv 56/24), e.g. if the system supports few (mksh R37c and up)
- -DMKSH_MIDNIGHTBSD01ASH_COMPAT – parse “--” on the shell command line like MidnightBSD 0.1 /bin/sh (different from all other shells); requires -DMKSH_BINSHREDUCED or “-o posix” (R38+) / “-o sh” (R39b+)
- -DMKSH_NOPWNAM – omit getpwnam(3) calls (~foo/ expansion) in order to not pull in the nsswitch or PAM libraries
- -DMKSH_NOVI – omit the Vi command line editing mode, which is orphaned anyway, yet functional (mksh below R39b)
- -DMKSH_NO_LIMITS – don’t compile the ulimit code (R38c+)
- -DMKSH_S_NOVI=0 – do not omit the Vi editing mode (R39b+)
- -DMKSH_S_NOVI=1 – omit the Vi command line editing mode (" ")
- -DMKSH_UNEMPLOYED – compile without job control (R37b+)
- -DUSE_REALLOC_MALLOC=0 – if realloc(NULL, n) is not equivalent to malloc(n) (n > 0) as ANSI C89 prescribes
You can override certain mirtoconf checks by setting environment variables
like HAVE_REVOKE=0 (default for Linux) – if these are set to 0 or 1,
the values are used; if unset, the values are probed (unless overridden by a
different check, such as MKSH_SMALL), if set to ‘x’ the probe is forced.
Useful items to enable/disable are HAVE_MKNOD and HAVE_READLINE (set to 0 to
disable, set to x to re-enable for MKSH_SMALL), HAVE_SETLOCALE_CTYPE (set to
0 if you know that it won’t ever return UTF-8), HAVE_PERSISTENT_HISTORY (0 to
not include this feature), HAVE_FLOCK_EX (if flock or mmap do not work on
files), HAVE_EXPSTMT (if ({ expression statements are buggy).
Defining MKSH_SMALL will disable persistent history (to re-enable, env HAVE_PERSISTENT_HISTORY=x), try to compile with -fno-inline, disable the mknod(2), realpath(3)[mksh R39 and below] and revoke(2) externs (to re-enable these, follow the above schema); (not overridable) implies traditional/conservative filedescriptor usage, MKSH_NOPWNAM; omits shebang checking in scripts, the Vi command line editing mode (mksh R39b and up can re-enable it by defining -DMKSH_S_NOVI=0), certain verbose error messages, the entire ‘-T’ command line option, the fancy $RANDOM handling; replaces inlines with separate functions for size over speed optimisation, etc. (In R39b and up, it disables a whole lot more things than in earlier versions.)
Operating Environment specific notes
Compiler: ACK
Support for ACK on Minix 3 has been added in mksh R37c with a workaround a known ACK bug (the “const” bug); it is now perfectly usable.
Support for other ACK versions or targets can be user-contributed. It currently lacks a sane frontend supporting things like “cc -E” (ack -E is ignored), at the least, and does not yet process system headers like <sys/types.h>.
Compiler: Borland C++ Builder
This compiler is somewhat supported in mksh R30 with UWIN’s cc wrapper. (We haven’t been able to produce a working executable though.)
Compiler: DEC/Compaq/HP C for OSF/1 and Tru64
This compiler is fully supported with mksh R33b (partial support did appear earlier).
The ucode based compiler, linker and loader for Digital UNIX (OSF/1) V2.0 on MIPS is supported since mksh R36. It may, however, be forced to link statically to work around a bug in the toolchain.
Compiler: Digital Mars
This compiler is somewhat supported in mksh R30 with UWIN’s cc wrapper and a few kludges. (We haven’t been able to produce a tested executable though, due to general stability issues with the UWIN platform.)
Compiler: GCC
The GNU C Compiler 1.42, 2.7.2.1, 2.7.2.3, egcs (gcc 2.95) and the GNU Compiler Collection (gcc 3.x, 4.x) are known to work, but not all versions work on all targets. Specific C flags, known extensions, etc. are autoprobed; cross-compilation works fine. Use of gcc 4.x is discouraged because of several dangerous changes in how the optimiser works; it is possible to work around their trading off reliability for benchmark-only speed increases, but because mksh developers do not use gcc 4.x this will have to be user-contributed. On the other hand, gcc 3.x (in some cases 2.x) is the best choice for compiling mksh.
On BSDi BSD/OS, where gcc 1.42 and gcc 2.7.2.1 are available, the cc(1) manual page mentions that gcc 1.42 produces more reliable code, so we recommend to build mksh with CC=cc (gcc1) instead of CC=gcc or CC=gcc2 there instead.
Since mksh uses ProPolice, the Stack-Smashing Protector, some GCC versions’ compilates require additional shared libraries.
GCC and Valgrind do not always play well together, hence the build option -valgrind adding -fno-builtin to avoid gcc producing code that can access memory past the end of the allocation.
Compiler: HP C/aC++
HP’s C compiler (/usr/bin/cc on HP-UX) is supported in mksh R30 and above; on IA64, only the LP64 model can be used; mksh used to segfault in the ILP32 module (or rather, the system libraries did, I think), so it was default. PA-RISC too works fine, so this compiler is a primary choice.
In mksh R39b and up, you must set CFLAGS='+O2 +DD64' on IA64 to get the same behaviour as previous versions; the 32-bit mode is now the default. The HP-UX bundled compiler /usr/ccs/bin/cc works as well as HP aCC, except of course that it does not optimise. (GCC and C99 extensions aren’t actually used by mksh.)
Compiler: IBM XL C/C++ / VisualAge
IBM xlC 9.0 on AIX 5.3 is supported in mksh R30 and above.
IBM xlC 8.0 on Linux/POWER and IBM xlC 6.0β on MacOS X are on the TODO.
IBM xlC 7.0 on AIX 5.2 is supported in mksh R35c and above.
Compiler: Intel C/C++/Fortran
ICC emulates GCC quite well (too well for my taste), is fully supported in mksh R30 and above on several platforms, but spits out lots (and I mean huge ugly lots) of bogus warnings during compile. We’re not going to work around these; let Intel fix their compiler instead. Some of these warnings were even responsible for bugs in mksh.
I could not get the Intel Compiler 10 for Windows® to work.
mksh enables the ICC stack protector option automaticaly. Compilates usually require the Intel shared libraries to be around.
Compiler: LLVM
Apple llvm-gcc from Xcode 3.1 had full success with mksh R34.
Vanilla llvm-gcc works fine as well.
Vanilla llvm-clang starting at r58935 produces working code with mksh R36b and up.
Compiler: Microsoft® C/C++
Support for the Microsoft® C Compiler on Interix and UWIN, with the respective /usr/bin/cc wrappers, appeared in mksh R30. The following product versions have been tested:
CL.EXE: Microsoft (R) 32-bit C/C++ Standard Compiler Version 13.00.9466 for 80x86
LINK.EXE: Microsoft (R) Incremental Linker Version 7.00.9466
(both are part of the .NET Common Language Runtime redistributable)
CL.EXE: Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
LINK.EXE: Microsoft (R) Incremental Linker Version 8.00.50727.42
(both are part of Visual Studio 2005 C++ Expreß)
You’ll have to change Interix’ cc(1) wrapper though: replace /Op
with /Gs- to disable the stack checks (missing support in libc
for them, they used to be off by default) and remove /Ze.
On Interix (SFU 3.5), this compiler is maturely usable and a good choice.
On GNU/Cygwin, using wgcc it might be possible to use this compiler. I could not test that yet, though.
On UWIN, this is usable as well.
Compiler: MIPSpro
Support for SGI’s MIPSpro compiler on IRIX appeared in mksh R33b.
Compiler: nwcc
Support for nwcc appeared in mksh R36b. nwcc 0.7.9 can build mksh R39; vendor is working on fixing the remaining non-critical issues. nwcc_0.8-091027 (unstable) and mksh R39b work well together.
Compiler: PCC (BSD)
Support for the Caldera/SCO UNIX® based, BSD-licenced portable C compiler in the ragge version has been added with mksh R31d. Versions from end of April 2008 onwards are known to work reliably, even with -O enabled.
The compiler itself rarely works on GNU/Linux or Darwin due to GNUisms, assembler problems, etc. though.
Compiler: SUNpro
Support for the SUN Studio 12 compiler (cc 5.9) as well as cc 5.8 appeared in mksh R30; other versions might be supported as well. This compiler is a primary choice.
Using SUNWcc on MirBSD
$ SP=/home/tg/Misc/suncc/sunstudio12 $ LD_LIBRARY_PATH=$SP/prod/lib/sys:$SP/prod/lib CC=$SP/prod/bin/cc \ LDFLAGS="-Yl,$SP/S" sh /usr/src/bin/mksh/Build.sh -r
Compiler: tcc (Tiny C)
Support for Fabrice Bellard’s tcc appeared in mksh R31, although its unability to do ‘-E’ in older versions gave us some headache, and glibc currently makes it impossible to link the final executable or run it.
Compiler: TenDRA (maybe Ten15 too)
Support for TenDRA appeared in mksh R31 and appears to be solid; mksh uses the ‘system’ profile for compiling by default. Users who wish to build mksh with a different profile are welcome to help to port it.
See ULTRIX for an example of getting a ‘POSIX’ profile to work.
Compiler: DEC ucode (MIPS CC)
Since mksh R33c, ucode on Ultrix is fully supported.
Distribution: FreeWRT, OpenADK
These distributions provide the same support cross-platform, with µClibc and/or eglibc, and thus should behave the same on all supported targets.
Platform: Android
Supported with OpenADK (static eglibc) and NDK (although the build process is currently not feasible with an Android.mk file but possible if the CPPFLAGS and signames.inc are pregenerated; sys_signame[] has been pushed upstream and is currently under evaluation). Integration into the SDK and hence Android proper, as /bin/sh, is also pushed into Gerrit and under evaluation.
Platform: iPhone
This is just Mac OSX, compile (natively, or cross via the SDK) and copy.
Platform: Maemo
This is like Debian, and packaging is available via the Garage and the Extras repository. Helpers (for GUI integration and actual on device testing) seeked.
Toolchain: dietlibc
Fefe’s dietlibc works in mksh R34, although his opinion towards certain standards, such as caddr_t, strcasecmp(3), etc. are weird.
Toolchain: klibc
klibc (with stock klcc as compiler wrapper) works if the patch from the Debian bug reports is applied and -DMKSH_NO_LIMITS is used to build mksh(1).
OS: AIX
Support for AIX with xlC appeared in mksh R30.
If passing custom LDFLAGS, don’t forget the export symbols required for using libcrypt. If passing custom LIBS, don’t forget -lcrypt.
OS: BeOS / Haiku
ahoka@ has begun porting, but it doesn’t work yet.
OS: BSDi BSD/OS
BSD/OS 3.1 works fine with mksh R33.
OS: MS-DOS, DR DOS, FreeDOS
DJGPP’s bash.exe fails to run Build.sh, thus this is currently not supported. (We tried!)
OS: GNU/Cygwin
This operating environment is supported as much as it adheres to standard POSIX/SUSv3 conformant things. No workarounds for .exe suffixes or other platform-specific quirks have been or will be added.
OS: Darwin / Mac OSX
Works pretty well.
OS: DragonFly BSD
Perfect choice. Note /bin/sh compatibility needs a quirk.
OS: FreeBSD
Perfect choice. Note /bin/sh compatibility needs a quirk.
OS: GNU/Hurd
This operating system is supported (on i386) since R29 but not well tested. mksh is part of Debian GNU/Hurd, so it is expected to work.
Starting with mksh R39b, there is no arbitrary limit on pathnames any more, as the operating system requires. (However, there are still other inherent limits in mksh, such as that of an interactive input line.)
OS: GNU/k*BSD
This operating environment has been supported for quite a while as part of Debian and somewhat tested.
OS: GNU/Linux
While POSIX does not apply to “GNU’s Not Unix”, the FHS (ex-FSSTND) does; please convince your distributor to move ed to /bin/ed if not already done. Manual page installation paths are not standardised in older distributions either.
Besides glibc (GNU libc), dietlibc (from Fefe), µClibc (embedded), klibc (for initramfs) and libc5 (on Linux 2.0.38) work, but locale detection is not automatic for some of them.
mksh can be used as /bin/sh on Debian and similarly strict distributions, which allow to use e.g. ash/dash there as well.
OS: HP-UX
Support for HP-UX with GCC appeared in mksh R29 and works with HP’s C compiler and is no longer experimental in mksh R30. Please use stty(1) to make the terminal sanely usable.
If passing custom CFLAGS, don’t forget -mlp64 (GCC) or +DD64 on Itanium.
OS: Interix
We have only tested SFU 3.5 on Windows® 2000, not SUA on Windows® 2003 SR1 or the version integrated into Vista. Windows 7’s works, gcc only though.
As the Unix Perl which comes with Interix is too old, and the ActiveState Perl has… other issues, to run the regression tests, please install Perl from NetBSD® pkgsrc® instead.
As of mksh R30, the native compiler (cc(1)) is supported in addition to gcc, calling Microsoft C. Do not use the c89(1) wrapper.
If passing custom LIBS, don’t forget to add -lcrypt or any other library providing arc4random(3).
mksh can replace /bin/ksh and /bin/sh without any problems.
OS: IRIX
Support for IRIX64 6.5 appeared in mksh R33b.
OS: MidnightBSD
mksh is part of MidnightBSD 0.2-CURRENT and above and used as native /bin/ksh; it can be used as /bin/sh as well with a quirk.
MidnightBSD 0.3 uses mksh as /bin/sh indeed.
OS: Minix
Minix 3 is supported starting mksh R37b (gcc), R37c (ACK/adk cc). Minix 1 and Minix 2 will never be supported due to size constraints on 16-bit platforms, unless a user contributes code.
Minix 3 contains a /usr/bin/ed which, even if copied to the correct directory (/bin), will fail the regression tests due to bugs. A modern ed(1), if compiled, might help with it similarily to QNX, but MirBSD ed needs very many patches, so this was not tried.
OS: MirBSD
Perfect choice. This is where mksh comes from.
OS: NetBSD
Perfect choice.
Starting with NetBSD 1.6, mksh can replace /bin/ksh and /bin/sh without any problems. On NetBSD 1.5, mksh can only replace /bin/ksh safely.
OS: OpenBSD
The setlocale(3) call in OpenBSD’s libc will always return the “C” locale and therefore has been disabled by default.
mksh can replace /bin/ksh and /bin/sh without any problems. mksh is supposed to be a superset of oksh (except GNU bash-style PS1, weird POSuX character classes, and an incompatible ulimit builtin change).
OS: DEC/Compaq OSF/1, Compaq/HP Tru64
Digital Unix is somewhat supported using gcc as of mksh R31b. With mksh R33b, many more versions and the native compiler work. In fact, gcc sometimes segfaults, so use the vendor compiler.
OS: Plan 9
Plan 9 is not supported yet – we were able to create an executable, but it did not return to the prompt after running a non-builtin command; this is job control issues, and patches are welcome. (Note this is for R37 and below; R37b might actually work, but someone would have to test this.)
Due to the unavailability of ttys, job control will never be supported.
The APE (ANSI’n’POSIX Environment) is required to build mksh; I don’t remember which compiler I used, but I think it was GCC.
OS: PW32 on Win2k
PW32 is not supported yet – killpg(3) is missing, and it’s possible that PW32 and Minix 3, at least, need job control disabled or worked around. Maybe peek at how ash/bash for PW32 do it. gcc works.
OS: QNX/Neutrino
QNX/Neutrino (Perl: “nto”) support appeared in mksh R36b.
The QNX ed(1) fails the regression tests due to being broken; compile the MirBSD ed and place it in /bin/ to fix this.
OS: Solaris
Solaris is full supported since “forever” with gcc, and since mksh R30 with Sun’s C compiler. Both 32-bit and 64-bit modes work; 64-bit mode is not enabled by default by Build.sh, you must do that manually by passing CFLAGS of -O2 -m64 or -xO2 -xarch=generic64.
Solaris does not come with Berkeley mdoc macros for nroff, so using the HTML or PDF versions of the manual pages or pregenerating a catman page on another OS is required.
OS: Syllable Desktop
This does not yet work due to a signal passing bug in the AtheOS kernel, we were told by their developers. However, mksh R33 is at the same level of support as Plan 9 now.
Chances are a more recent mksh works with a more recent Syllable.
Syllable Server will work, as it is, at the moment, “just” a GNU/Linux distribution with a different GUI. This may change though.
OS: ULTRIX
Even on ULTRIX 4.5, mksh R33c works fine. The system ksh must be used for running the Build.sh script, though.
You however must pass the -YPOSIX option to the ucode compiler, as the default -YBSD profile produces a broken executable (spins instead of starting up), and the -YSYSTEM_FIVE profile does not even compile. See TenDRA for another OE which has issues with different OE profiles. (Build.sh takes care of this automatically.)
OS: UWIN-NT
Compilation of mksh R30 on UWIN works with several compilers (bcc, dmc, msc – I could not get gcc-egcs, gcc-2.95, gcc-mingw, icc to work) but the platform itself is very flakey, and even some regression tests crash, due to target limitations apparently. Within these limits, mksh is usable.
After compiling
The Build.sh script generates an executable (“mksh”, except on
GNU/Cygwin, where it is called “mksh.exe”), a shell script to use the newly
built mksh to run the regression test suite (“test.sh”), and (unless the
-r option was given) a pre-formatted manual page (“mksh.cat1”).
It also lists installation instructions unless -Q was provided.
Now it’s the time to run
% ./test.sh -v
in order to see if the shell works.
To actually install mksh, copy the binary to some place in $PATH, i.e. /bin/mksh, $HOME/.bin/mksh, /usr/local/bin/mksh, or whatever your packaging system wants; strip it and run chmod 555 on it. (This can easily be achieved with install(1) – on Solaris, this is /usr/ucb/install not /usr/bin/install – with the arguments -c, -s, -m 755¹, and -o/-g. ① with 555, strip(1) cannot write the file any more, chmod 555 afterwards.) Also append its installation path to /etc/shells, install the dot.mkshrc file (usually alongside with the copyright file and other documentation), copy it to /etc/skel/.mkshrc if your operating environment has this means to include default dotfiles; install either the catman page (mksh.cat1) to, for example, /usr/share/man/cat1/mksh.0, or the mdoc page (mksh.1) to the standard location (/usr/share/man/man1/ or /usr/man/man1/ or whatever your operating environment requires). The manual page requires the Berkeley mdoc macros (either the BSD or the GNU groff version) to be installed during formatting time.
Note that a ~/.mkshrc file will not be executed if $ENV is set and not empty, nor is there an /etc/mkshrc.
For packagers: Upgrades
Note: This is not the ChangeLog, these are the packager-visible upgrade notes regarding changes in the build system (Build.sh and friends, compiler support, packaging conventions, bad examples, etc).
mksh R39 has user-visible changes regarding “set -u” (“set -o nounset”) and alias/function name conflicts regarding whitespace before parenthesēs, as well as a much enhanced dot.mkshrc sample file I urge to install. People using a Makefile to build it may need to regenerate their set of CPPFLAGS used; CPPFLAGS handling in general has improved. There is now a defined but unsupported way to make printf(1) a builtin; this is not tested and adds a huge SLOB of foreign code to the build, lets the shell use stdio and floating point, making it bloated and fragile; if you still want it (hi Md), set USE_PRINTF_BUILTIN=1 and add printf.c from mircvs://src/usr.bin/printf/ to the build.
mksh R38c adds QNX fixes, build system fixes, and the (not recommended) ability to use -DMKSH_ASSUME_UTF8=0 to skip the environment checks for locale (leading to one (supposedly un-)expected regression test failure). Use -DMKSH_NO_LIMITS to skip the ulimit builtin (klibc).
mksh R38b works on QNX 6.4 out of the box.
mksh R38 offers -DMKSH_MIDNIGHTBSD01ASH_COMPAT and users should be warned about the “!string” line and UTF-8 mode changes.
Freshmeat announcements have ceased because the site switched to a very user-unfriendly HTML (especially Lynx). Use the RSS feed instead.
Inclusion in other operating systems
- Debian GNU/Linux, GNU/Hurd and GNU/kFreeBSD have an mksh package maintained by the MirOS Project and uploaded (sponsored) by Bastian “waldi” Blank, Otavio Salvador, and Patrick Schönfeld; the debconf questions were taken from dash. We do not provide an inofficial source package any longer.
- Gentoo GNU/Linux has an mksh ebuild created by Hanno Böck.
- Fedora GNU/Linux 8, 9, 10, 11, and RHEL 4 and 5 (via EPEL) now officially contain an mksh package (spec file). There are some Instructions for activating EPEL (RHEL only), then just type yum install mksh.
- The OpenSuSE Build
Service provides an mksh package inside the shells
repo, thanks to Pascal “loki” Bleser and Marcus “darix” Rückert; the
RPMs are available as SRPM (source RPM) as well as for various
distributions.
The inofficial portable SRPM has been retired; the OBS SRPM
has been changed to be buildable on Debian and MirBSD as well as include
the contributed arc4random.c file. There are more
downloads available, just browse a little.
Basically, go to mirabilos’ home project, find the subdirectory most closely matching your GNU/Linux distribution and proceed to the binaries. The SRPMs (source RPM in the */src/ subdirectories) should be all the same. - Fink delivers an mksh package from Andreas “gecko2” Gockel.
- SMGL (Sourcemage GNU/Linux) has an mksh spell in their grimoire, developed by the MirOS Project together with Daniel “morfic” Goller, updated by Thomas “sobukus” Orgis and Vlad “Stealth” Glagolev.
- In the FreeWRT Embedded GNU/Linux Appliance Development Kit (meta distribution), the mksh package is maintained by us. mksh is also the default shell in FreeWRT trunk (soon to be 1.1) and above.
- OpenWrt Embedded GNU/Linux Distribution also provides mksh on ADSL/WLAN routers thanks to Felix “nbd” Fietkau.
- Ubuntu GNU/Linux, the grml (and grml64) Live-CD, and other Debian derivates also have an mksh package; Knoppix, SIDUX, Nexenta OS (GNU/Solaris), and grml-small do not contain or offer mksh. Note: We need URLs to the packages for these, can anyone provide any?
- Arch GNU/Linux users can install an mksh package by Daniel “homsn” Hommel.
- FreeBSD® Ports (for FreeBSD, very old DragonFly BSD versions and DesktopBSD) also have a port created by Andreas “ankon” Kohn and kept up to date by Martin “miwi” Wilke. It is unknown if this applies to PC-BSD too, but there’s no mksh PBI (yet?).
- MidnightBSD uses mports, a derivate of FreeBSD® ports. Naturally, they deliver mksh as well. MidnightBSD 0.2-CURRENT from 18th August 2007 onwards has mksh as both /bin/mksh and /bin/ksh, i.e. it is the default MidnightBSD Korn shell. From 29 March 2009 onwards, it is also the default /bin/sh (since MidnightBSD 0.3).
- NetBSD® pkgsrc® (native also on recent DragonFly BSD; available for many other operating systems as well) has a package created by us and kept up to date by Blair Sadewitz and Adam “replaced” Hoka. We do not provide an inofficial source package any longer.
- The Desktop NetBSD project also contains mksh; see the source of their meta package. This will provide their users with a modern, fast, secure, featureful shell and enhance the experience.
- Beastiebox also comes with mksh as an option. It’s NetBSD® based, mostly.
- The MirPorts Framework brings mksh to OpenBSD, Mac OSX and Interix as well as older MirOS BSD versions, which have mksh as native Korn Shell.
- OpenBSD ports do not package mksh, but an inofficial port is available.
- ChinaLinux mirrors (and apparently packages) mksh.
- Some US-American Apple Users’ Group (the HMUG) packages mksh for Darwin, too.
- Frugalware Linux contains a broken mksh package; the build logs show the problem is on their side. (XXX Someone has any URL for us?)
- Olivier Duchateau provides Slackware/Zenwalk GNU/Linux packaging for mksh
- There are probably many more, please drop us a note!
- Softpedia lists mksh, just like the FSF/UNESCO directory.
- The ports directory may contain additional ports in source and/or binary form.
These packages are not official and have not always been tested by mksh developers; please keep this in mind.
Recent Changes
Changes in the current (unreleased) development version:
- Begin porting mksh to the Plan 9 ANSI’n’POSIX Environment (not finished)
- Port to Syllable (again much improved; support now en par with Plan 9’s, thanks to Anthony Morphett <awmorp@gmail.com> – maybe the rest is a kernel bug?)
- [ahoka] Begin porting to Haiku and, implicitly, BeOS (not finished yet)
mksh R39b is a major stability and bugfix update:
- [tg] Clean up some more strict *roff or compiler warnings: dashes, undefined macros; casting errors (constness, signedness, type width/class) and catch possibly unaligned pointer dereferences early; remove code/rodata redundancies, plug memory leaks
- [smultron] Tweak the manual page: point out the word “colour”
- [tg] Optimise dot.mkshrc DJB’s CDB hash implementations; add Bob Jenkins’ one-at-a-time hash (standard and leading-bit initialised); fix signedness in expressions; let the hashes use stdin if "$*" is empty, like Lb64{en,de}code; use “[[ -o utf8-mode ]]” ipv “[[ $- = *U* ]]”
- [tg] Build.sh portability fixes: missing prerequisite headers; ensure $CC is never called without $CFLAGS; fix test.sh, et al.
- [tg] Optimise internal variable representation; use one-at-a-time hash; cache hash values for faster resizing at zero memory cost; clean up hash table (keytab) code; switch hash table collision resolution algorithm to Python’s; prepare for later changes (commented out)
- [tg] Fix type errors in the source code (int → bool, size_t, mksh_uari_t)
- [tg] Fix “${foo:bar:$baz}” not working (missing substitute() call)
- [tg] Implement “typeset ±a” as nop
- [tg] Support ksh93-like “${!foo[@]}” listing the keys (indicēs) of all set array elements – zsh does it too (${(k)foo}), bash4 can’t :þ
- [tg] Support bash/ksh93-like “array=([key]=value …)” and (additionally) “set ±A array -- [key]=value …” to directly specify indicēs to use
- [tg] Document the optional, unsupported, printf(1) builtin in TFM
- [tg] Replace realpath(3) dependency and internally used get_phys_path() pdksh code with own implementation; always offer the realpath builtin
- [tg] Implement nameref='typeset -n' (bounded variables) like AT&T ksh93 but with mksh-style nested/dynamic scoping and on-use resolving; they cannot currently be stored in an array though
- [tg] Add “chdir” builtin doing the same as the “cd” special builtin
- [tg, David Korn] Document more differences between mksh (and pdksh) and AT&T ksh (or, more specific, ksh88, ksh93) in the manual page
- [tg] Support “'a'” as an alternative to “1#a”, like ksh93 does
- [tg] Add ksh’s “test -o ?foo”: true if “foo” is a valid shell option, where “foo” can be “xtrace” or “-x” or “+x” (these three are equivalent)
- [tg] Support “$'…'” backslash-expanding single-quoted strings, as requested by David G. Korn, with almost the same syntax and semantics
- [tg] Unify backslash expansion code (C style vs. print builtin mode)
- [tg] Support “function stop () {” bashism
- [tg] For several items in the source code that require order to be kept, provide it from multiply-included header files; sort correctly
- [tg] Get rid of unneeded FMONITOR (-m) for shells without job control; sync list of flags, comments and manpage with reality
- [tg] If MKSH_SMALL, reduce size by removing editor functionality
- [tg] Support VT100 emulator style {Ctrl,Alt}-CurLeft/Right keycode sequences with new vt100-hack emacs bind function (LP: #355883)
- [cnuke, tg] Remove more, like GNU bash extensions, from MKSH_SMALL
- [tg] Remove more functionality, such as Emacs command line editing mode bind key macros, and other extensions, from MKSH_SMALL to help floppies
- [tg] Make forking and subshells less expensive wrt. random state
- [tg] Build and source code fixes for / caught by SUNWcc, HP aCC, pcc, DEC ucode cc (MIPS), GCC, LLVM clang
- [tg] Make undef/def MKSH_NOVI into 0/1 MKSH_S_NOVI build flag
- [tg] Get rid of "U getenv" in nm(1) output, we already import environ
- [tg] Simplify $RANDOM handling: reads are now either arc4random(3) (if available: set +o arc4random is no longer possible) or an LCG; writes are arc4random_pushb(3) if available for explicit writes, arc4random_addrandom(3) otherwise, or another one-at-a-time hash feeding the LCG; furthermore, RANDOM is now always exported to and imported from (implicit read: no push to kernel done) the environment vector on startup and spawning
- [tg] Internal code cleanup, optimisation, moves to different files; dead/commented out code removal; code beautification
- [tg] Document mksh does not exactly use OPTU-8/OPTU-16 in the manpage, as well as when characters, octets, or screen columns are used
- [tg] Fix exit 127 on "mksh /tmp/horsies" ipv of 1 on ENOENT, #548744
- [Clint Adams] Fix typos in the testsuite
- [tg, Clint Adams] Begin a shared testsuite for mksh and posh
- [tg] Document (via check.t) another posh bug affecting mksh, #445651
- [tg] Make 「((foo) || bar)」 and 「((foo) | (bar))」 work
- [tg] Fix lazy evaluation of assignments by ternary operator, #445651
- [tg] Work around Cygwin bugs (quirks) hindering the testsuite
- [tg] In FSH mode, “echo [-n] 'foo\x40bar'” shall not be expanded
- [tg] Let Build.sh run with AIX bsh (SVR3 Bourne Shell)
- [tg] Let set -- $(false); echo $? return 0 (POSIXly correct) in FSH mode, 1 (needed for getopt(1) support) otherwise
- [tg] Changes of variables inside Bourne style POSIX functions indeed affect the current execution environment (of the function caller)
- [tg] Fix getopts behaviour (sync with AT&T ksh93 not ksh88)
- [tg] “eval $(false)” shall return 0 (Debian Closes: #550717)
- [tg] Ensure that /* apo'strophes in comments */ work
- [tg] New Build.sh flag -M to not compile but spit out a Makefrag.inc file from the current build environment, such as the (cross)compiler, CFLAGS, LDFLAGS, etc. which then can be sourced by e.g. the Android NDK, or built with make(1) – BSD make and GNU make have been tested, but almost all makes should work if the source and build directories are the same or VPATH is supported at least (use of this option is discouraged)
- [tg] Overhaul and simplify handling of (special) variables
- [tg] Further reduce memory (code/data) and import footprint
- [tg] Use functions without PATH_MAX limit on GNU/Hurd
- [tg] Fix tab completing pathnames containing ‘:’, ‘=’, ‘$’ or ‘`’
- [tg] Support ‘-T <tty>’ even if MKSH_SMALL and fix it
- [tg] Remove "which" alias "whence -p" to allow "which -a" in dot.mkshrc and add more examples, some commented out
- [tg] Fix print_columns() issue with displaying items where characters had differing number of octets and columns, and the off-by-one which had hidden this problem with 2-octet 1-column and 3-octet 2-column chars
- [tg] Beautify the manpage in both AT&T nroff and GNU groff
- [tg] Fix null-expansion of “${x%?}” if $x is unset
- [tg] Make some globbing (${x%?}) operate on characters instead of octets; update manual page to reflect that others still do and remove wording that let people think we’d ever support POSuX character classes
- [tg] New ${%foo} returning width of $foo in screen columns, or -1 if $foo contains an ASCII/latin1/Unicode C0/C1 control character
- [tg] Fix subtle possible portability problem wrt. CHILD_MAX
- [tg] Honour ±U on command line of an interactive shell
- [tg] Fix dead stores and other bugs pointed out by the Clang static analyser; put assertions in places it has false positives (-DDEBUG)
- [tg] Plug uninitialised memory access and possible out-of-bounds read of a buffer caught by Valgrind; change one memcpy(3) to memmove(3) where srcbuf and dstbuf overlap; place (-DDEBUG) workaround for false positive
- [tg] HP aCC: change IA64 default from forced +DD64 to using the default; support Bundled compiler; fix double-const warning
- [tg] Rework __attribute__ compiler capability check
- [tg] Apply errno save/restore related fix from (sync with) oksh
- [tg] Build.sh: output message when switching from autoconfiguration to building / output generation (requested by Matt “lewellyn” Lewandowsky); use “conftest.c” ipv “scn.c” (to please ccache); check for “-xipo” with SUNWcc (suggested by lewellyn as well)
- [tg] Allow “unset foo[*]” (keep attributes) and “typeset foo[*]” (for forward-compatibility; in R39b it’s the same as “typeset foo”)
- [tg] When persistent history is enabled (but not MKSH_SMALL) and used, intertwine the shells concurrently accessing $HISTFILE better ⇒ sync on empty or duplicate line as well (requested by Maximilian “mxey” Gaß)
- [tg] Split off “set ±o posix” and “set ±o sh” again, to be somewhat
more compatible to various old or vendor versions of pdksh and mksh:
- MKSH_BINSHREDUCED sets FSH but not FPOSIX
- MKSH_MIDNIGHTBSD01ASH_COMPAT depends on FSH but not FPOSIX
- The echo built-in behaves the same for FPOSIX and FSH
- File descriptors > 2 are not closed for both FPOSIX and FSH
- Both “set -o posix” and “set -o sh” call “set +o braceexpand”
- In contrast to R39 and below, the errorlevel of “set -- $(getopt ab:c "$@")” is now the same in ksh and FPOSIX mode (0) and only FSH will use the errorlevel of getopt (used to be the other way round)
- [tg] Document some more shortcomings in the mksh(1) manual page
- Contributed printf.c fixes:
- [tg] Make printf(1) builtin use “$'…'” mode, like ksh93
- [tg] Fix const-cleanliness
- Contributed arc4random.c fixes:
- [tg] Fix buffer overflows in the Win32 codepath of the contributed arc4random.c file and limit the rate of expensive CryptGenRandom calls if we have other (seed in registry key) entropy pools
- [tg] Fix uninitialised memory access caught by Valgrind
- [tg] New Build.sh flag -valgrind since I’m lazy
mksh R39 evolved into these through various means:
- [tg] Shut up a bogus gcc warning during configuration process
- [tg] Spell AT&T consistently in the source code
- [tg] Tweak mksh(1) manual page, from wbx@ and «lewellyn:#ksh»
- [tg] dot.mkshrc: fix $@ vs. $* mix-up
- [tg] dot.mkshrc: add DJB cdb hash function
- [tg] Sync with oksh: fix Vi editing mode word erase handling, again
- [tg] Skip whitespace between POSIX style shell function name and its definition parenthesēs during detection if an alias of the same name already exists to be more robust (Debian Closes: #535970)
- [tg] Build system improvements for ACK and nwcc, both on Debian sid
- [tg] Fix spelling error in changelog discovered by Lintian
- [tg] Aligh “set -o nounset” / “set -u” behaviour with future POSIX standard, as discussed with GNU bash maintainers, David Korn from AT&T ksh93, and The Open Group; prompted by use in Debian; Closes: #539538
- [tg] add an unsupported way to make printf(1) a builtin
- [tg] Build system and regression test code and comment improvements: better and more comments matching reality better; more reliability w.r.t. passed CPPFLAGS; more of the MKSH_SMALL changes may be overridden, all of them are now enumerated on the webpage; fixed some breakage; portability
- [tg] MKSH_NOPWNAM and MKSH_SMALL will now both disable the ~fac/ (homedir) expansion code wholly if defined, not just getpwnam(3) calls
- [tg] shells without job control no longer define the standard “stop” and “suspend” aliases (they are pointless anyway); regression tests know
- [tg] use system RCS ID macros on MirBSD if decent enough
- [tg] shut up bogus gcc 4.5/trunk warnings caused by over-optimisation
- [tg] restore ANSI C compilability broken in R38 (speed up, even)
- [tg] use memcpy(3) ipv strlcpy(3) if possible and safe and secure
mksh R38c contains the following fixes:
- [tg] Fix regression tests on OSes insisting on a shebang (Cygwin)
- [Sean Boudreau] QNX 6.4.2 ed(1) is said to have the bugs fixed
- [tg] Build.sh bugfixes: -DMKSH_BINSHREDUCED can also be given without -DMKSH_SMALL; allow HAVE_REALPATH=x and HAVE_REVOKE=x in the environment to re-enable these even if -DMKSH_SMALL disables them by default, like mknod already did
- [tg] -DMKSH_ASSUME_UTF8=0 skips the environment checks, like -DMKSH_ASSUME_UTF8=1, but disables the utf8-mode
- [tg] Apply some more KNF – style(9) – to the source; clean it up and further optimise for small size
- [OpenBSD] Fix segfaults caused by missing check for end of input in the tokeniser on “let --” and other input
- [OpenBSD] Make Vi editing mode ^W behave like Emacs mode’s
- [tg] If no killpg(3) is available, use kill(2) and hope it works
- [tg] -DMKSH_NO_LIMITS skips trying to build the ulimit code
mksh R38b fixes the following problems:
- [André Wösten] Add __NO_EXT_QNX to avoid picking up the wrong waitfor() from <libutil.h> in (while porting to) QNX 6.4
- [tg] Plug memory corruption issue introduced in R38
- [tg] Amend dot.mkshrc with a base64 en-/decoder in shell
- [tg] Import a manpage fix via OpenBSD from Alan R. S. Bueno
mksh R38 comes with these changes and fixes applied:
- [tg] Improve regression test output debugging
- [tg] Fix <libutil.h> prerequisites on MidnightBSD in mirtoconf
- [tg] Mention that RedHat BZ#496791 cannot currently be fixed in the manpage by discouraging use of apostrophes in comments in comsubs; add appropriate (expected-fail) regression tests
- [tg] Sync with OpenBSD ksh (mostly a no-op)
- [James Butler] Add search-history-up and search-history-down keybindings (tcsh-like) to the Emacs command line editing mode
- [tg] Bind new search-history-{up,down} to ANSI PgUp and PgDn keys
- [tg] Document ANSI default keybindings (↑↓←→ Home End Del PgUp PgDn) in the mksh(1) manual page as well
- [tg] Optimise internal UTF-8 handling code for size and reusability
- [tg] Incompatible change: ${foo:1:2} and ${#foo} now operate on characters, not on bytes. Characters are octets (set +U) or (utf8-mode) MirOS OPTU-8 multibyte characters (set -U)
- [tg] Improve regression tests relating to ${foo:1:2} and ${#foo} and let wc=1#x and utf8-mode
- [tg] Use per-file copyright notices, move global text to manpage
- [tg] Expose new MKSH_MIDNIGHTBSD01ASH_COMPAT ifdef; change it to only trigger if FPOSIX (or MKSH_BINSHREDUCED and /bin/sh)
- [tg] Remove already-dead “#if 0” style debugging code
- [tg] Change some code into a more portable fashion, optimise
- [tg] Allow [[ $foo ]] (ksh93 extension) mentioned by pgas
- [tg] Clean up mksh and the contributed arc4random.c for some conversion, enum and other warnings for gcc-snapshot trunk r147610
- [tg] Ensure no function uses more than 768 bytes of stack either
- [tg, wbx] Add extension to make “!string” lines work like in GNU bash

