LKSH(1) | General Commands Manual | LKSH(1) |
lksh
— Legacy Korn
shell built on mksh
lksh |
[-+abCefhiklmnprUuvXx ]
[-+o opt]
[-c
string | -s
| file
[args ...]] |
lksh
is a command interpreter intended
exclusively for running legacy shell scripts. It is built on
mksh
; refer to its manual page for details on the
scripting language. It is recommended to port scripts to
mksh
instead of relying on legacy or objectionable
POSIX-mandated behaviour, since the MirBSD Korn Shell scripting language is
much more consistent.
Do not use lksh
as an interactive or login
shell; use mksh
instead.
Note that it's strongly recommended to invoke
lksh
with -o
posix
to fully enjoy better compatibility to the
POSIX standard (which is probably why you use lksh
over mksh
in the first place);
-o
sh
(possibly additionally
to the above) may be needed for some legacy scripts.
lksh
currently has the following
differences from mksh
:
KSH_VERSION
string identifies
lksh
as “LEGACY
KSH
” instead of “MIRBSD
KSH
”. Note that the rest of the version string is identical
between the two shell flavours, and the behaviour and differences can
change between versions; see the accompanying manual page
mksh(1) for the versions this document applies to.lksh
uses POSIX arithmetic, which has quite a few
implications: The data type for arithmetic operations is the host ISO C
long data type. Signed integer wraparound is
Undefined Behaviour; this means that...
$ echo $((2147483647 + 1))
... is permitted to, e.g. delete all files on your system (the figure differs for non-32-bit systems, the rule doesn't). The sign of the result of a modulo operation with at least one negative operand is unspecified. Shift operations on negative numbers are unspecified. Division of the largest negative number by -1 is Undefined Behaviour. The compiler is permitted to delete all data and crash the system if Undefined Behaviour occurs (see above for an example).
set -o posix
is active,
lksh
always uses traditional mode for constructs
like:
$ set -- $(getopt ab:c "$@") $ echo $?
POSIX mandates this to show 0, but traditional mode passes through the errorlevel from the getopt(1) command.
function
reserved word
share the shell options (set -o
) instead of
locally scoping them.http://www.mirbsd.org/mksh.htm
http://www.mirbsd.org/ksh-chan.htm
To use lksh
as
/bin/sh, compilation to enable set
-o posix
by default if called as sh
(adding
-DMKSH_BINSHPOSIX to
CPPFLAGS
) is highly recommended for better standards
compliance.
For better compatibility with legacy scripts, such as
many Debian maintainer scripts, Upstart and SYSV init scripts, and other
unfixed scripts, also adding the -DMKSH_BINSHREDUCED
compile-time option to enable
both
set -o posix -o sh
when the shell is run as
sh
, as well as integrating the optional
disrecommended printf(1) builtin, might be necessary.
lksh
tries to make a cross between a
legacy bourne/posix compatibl-ish shell and a legacy pdksh-alike but
“legacy” is not exactly specified.
Talk to the MirBSD development team and users using the mailing
list at
<miros-mksh@mirbsd.org>
or in the #!/bin/mksh
IRC channel; mind the infos
from http://www.mirbsd.org/mksh-faq.htm#contact for
either. Consider migrating your legacy scripts to work with
mksh
instead of requiring
lksh
.
January 28, 2022 | MirBSD |