77740fcd3d
Note that we skipped R52c because it wouldn't build with clang (thanks to the "Shave 200 bytes off .text by revisiting string pooling" change). From the release notes: R53a is a snapshot/feature release: [lintian] Fix spelling [tg] Unbreak multi-line command history broken by history flush [tg] Fix redefining POSIX functions that were Korn functions before [tg, TNF] Fix bounds checks in Vi editing mode [tg] Handle combining characters at end of string or output correctly [tg] Fix ${!#} ${!?} ${!-} (POSIX, prompted by izabera) [tg] Fix shf.c-internal buffer overread on printing digits [J�rg] Fix a typo in the testsuite [arekm] Increase default edit line size (unless MKSH_SMALL) [tg] Improve description of Emacs mode keybindings, especially ^U [tg, arekm, jilles] Abort read builtin in case of read(2) errors [tg, izabera, carstenh] Fix most of the ambiguous corner cases related to ${[pfx]var[op[word]]} (${@:-1} still unsupported) [carstenh] Contribute some more testsuite coverage [tg] WDS_TPUTS now emits QCHAR newline reentrant-safe [tg] Fix var=<< implementation (LP#1380389) [tg, FreeBSD] Make XSI test(1) extensions behave as if they were POSIX [tg, izabera] Add $(<<<x) and $(<<EOF…) implementation [tg] Lower minimum screen size accepted as “sane” from the OS to 4×2 [tg, Torsten Sillke] Simplify tilde-expanded parameters [tg, Torsten Sillke] Fix default PS1 for substring matches [tg] Apply defer-builtin-with-arguments logic to realpath builtin [tg] Rework string pooling (own vs. compiler’s) (LP#1580348) [tg] Feature: print -A, prints arguments as characters [tg, izabera] Replace <<< and >>> as ROL and ROR operators with their new ^< and ^> spelling as per this proposal [tg, slagtc] Clear-to-EOL under tmux to work around its anti-feature [tg, p120ph37] Remove support for using file descriptors with more than a single digit, in preparation for named file descriptors [tg] Correct, but simplify (at the potential cost of more tty I/O than strictly necessary, though never redundant and (probably) not more than before when it was miscalculated), line clearing and redrawing [slagtc, tg] Implement new evaluate-region editing command Esc+Ctrl-E [tg] Prefer external rename utility over the recovery builtin [tg] Remove redundant full-line redraws [tg, Natureshadow] Fix errorlevel of ‘.’ (“dot” special builtin) when the sourced script does not run any commands, for POSIX compliance [tg] Refactor op tokens and edchars to shave off some more bytes [tg] Fix some bugs in the manpage and some occasional/minor code bugs [tg, Brian Callahan] Mark tests requiring new perl as !need-pass [tg, slagtc] Add $KSH_MATCH and, to make it usable, ${foo@/bar/baz} [tg, Score_Under] Fix bogus patch from OpenBSD: only NULL the global source in unwind when actually reclaiming its Area [izabera] Mention in the manpage that integer bases go up to 36 [Natureshadow] Fix /= operator broken during refactoring R52c is a bugfix-only release: [tg] Shave 200 bytes off .text by revisiting string pooling [tg, J�rg] Fix manpage for ditroff on Schillix [tg, wbx] Use sed 1q instead of unportable head(1) [tg] Implement underrun debugging tool for area-based memory allocator [tg] Fix history underrun when first interactive command is entered [tg, bef0rd] Do not misinterpret “${0/}” as “${0//”, fixes segfault [tg, Stéphane Chazelas] Fix display problems with special parameters [tg, Stéphane Chazelas] Catch attempt to trim $* and $@ with ?, fixes segfault (Todd Miller did this in 2004 for ${x[*]} already, so just sync) [Martijn Dekker] Fix “command -p” with -Vv to behave as POSIX requires [tg, jilles, Oleg Bulatov] Fix recusive parser with active heredocs [tg] Flush even syntax-failing or interrupted commands to history [tg, fmunozs] Fix invalid memory access for “'\0'” in arithmetics [tg] Explicitly reserve SIGEXIT and SIGERR for ksh [tg, izabera] Catch missing here documents at EOF even under “set -n” [kre, tg] Document Austin#1015 handling (not considered a violation) [tg, fmunozs] Fix buffer overread for empty nameref targets [tg] Fix warnings pointed out by latest Debian gcc-snapshot [tg, Martijn Dekker] Document upcoming set +o changes [Martijn Dekker] Expand testsuite for command/whence Change-Id: Ife475b25acae5a85277757cfe9f14c6575eac0cd
357 lines
8.7 KiB
Groff
357 lines
8.7 KiB
Groff
.\" $MirOS: src/bin/mksh/lksh.1,v 1.18 2016/08/10 18:20:05 tg Exp $
|
||
.\"-
|
||
.\" Copyright (c) 2008, 2009, 2010, 2012, 2013, 2015, 2016
|
||
.\" mirabilos <m@mirbsd.org>
|
||
.\"
|
||
.\" Provided that these terms and disclaimer and all copyright notices
|
||
.\" are retained or reproduced in an accompanying document, permission
|
||
.\" is granted to deal in this work without restriction, including un‐
|
||
.\" limited rights to use, publicly perform, distribute, sell, modify,
|
||
.\" merge, give away, or sublicence.
|
||
.\"
|
||
.\" This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
|
||
.\" the utmost extent permitted by applicable law, neither express nor
|
||
.\" implied; without malicious intent or gross negligence. In no event
|
||
.\" may a licensor, author or contributor be held liable for indirect,
|
||
.\" direct, other damage, loss, or other issues arising in any way out
|
||
.\" of dealing in the work, even if advised of the possibility of such
|
||
.\" damage or existence of a defect, except proven that it results out
|
||
.\" of said person’s immediate fault when using the work as intended.
|
||
.\"-
|
||
.\" Try to make GNU groff and AT&T nroff more compatible
|
||
.\" * ` generates ‘ in gnroff, so use \`
|
||
.\" * ' generates ’ in gnroff, \' generates ´, so use \*(aq
|
||
.\" * - generates ‐ in gnroff, \- generates −, so .tr it to -
|
||
.\" thus use - for hyphens and \- for minus signs and option dashes
|
||
.\" * ~ is size-reduced and placed atop in groff, so use \*(TI
|
||
.\" * ^ is size-reduced and placed atop in groff, so use \*(ha
|
||
.\" * \(en does not work in nroff, so use \*(en
|
||
.\" * <>| are problematic, so redefine and use \*(Lt\*(Gt\*(Ba
|
||
.\" Also make sure to use \& *before* a punctuation char that is to not
|
||
.\" be interpreted as punctuation, and especially with two-letter words
|
||
.\" but also (after) a period that does not end a sentence (“e.g.\&”).
|
||
.\" The section after the "doc" macropackage has been loaded contains
|
||
.\" additional code to convene between the UCB mdoc macropackage (and
|
||
.\" its variant as BSD mdoc in groff) and the GNU mdoc macropackage.
|
||
.\"
|
||
.ie \n(.g \{\
|
||
. if \*[.T]ascii .tr \-\N'45'
|
||
. if \*[.T]latin1 .tr \-\N'45'
|
||
. if \*[.T]utf8 .tr \-\N'45'
|
||
. ds <= \[<=]
|
||
. ds >= \[>=]
|
||
. ds Rq \[rq]
|
||
. ds Lq \[lq]
|
||
. ds sL \(aq
|
||
. ds sR \(aq
|
||
. if \*[.T]utf8 .ds sL `
|
||
. if \*[.T]ps .ds sL `
|
||
. if \*[.T]utf8 .ds sR '
|
||
. if \*[.T]ps .ds sR '
|
||
. ds aq \(aq
|
||
. ds TI \(ti
|
||
. ds ha \(ha
|
||
. ds en \(en
|
||
.\}
|
||
.el \{\
|
||
. ds aq '
|
||
. ds TI ~
|
||
. ds ha ^
|
||
. ds en \(em
|
||
.\}
|
||
.\"
|
||
.\" Implement .Dd with the Mdocdate RCS keyword
|
||
.\"
|
||
.rn Dd xD
|
||
.de Dd
|
||
.ie \\$1$Mdocdate: \{\
|
||
. xD \\$2 \\$3, \\$4
|
||
.\}
|
||
.el .xD \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
|
||
..
|
||
.\"
|
||
.\" .Dd must come before definition of .Mx, because when called
|
||
.\" with -mandoc, it might implement .Mx itself, but we want to
|
||
.\" use our own definition. And .Dd must come *first*, always.
|
||
.\"
|
||
.Dd $Mdocdate: August 10 2016 $
|
||
.\"
|
||
.\" Check which macro package we use, and do other -mdoc setup.
|
||
.\"
|
||
.ie \n(.g \{\
|
||
. if \*[.T]utf8 .tr \[la]\*(Lt
|
||
. if \*[.T]utf8 .tr \[ra]\*(Gt
|
||
. ie d volume-ds-1 .ds tT gnu
|
||
. el .ds tT bsd
|
||
.\}
|
||
.el .ds tT ucb
|
||
.\"
|
||
.\" Implement .Mx (MirBSD)
|
||
.\"
|
||
.ie "\*(tT"gnu" \{\
|
||
. eo
|
||
. de Mx
|
||
. nr curr-font \n[.f]
|
||
. nr curr-size \n[.ps]
|
||
. ds str-Mx \f[\n[curr-font]]\s[\n[curr-size]u]
|
||
. ds str-Mx1 \*[Tn-font-size]\%MirOS\*[str-Mx]
|
||
. if !\n[arg-limit] \
|
||
. if \n[.$] \{\
|
||
. ds macro-name Mx
|
||
. parse-args \$@
|
||
. \}
|
||
. if (\n[arg-limit] > \n[arg-ptr]) \{\
|
||
. nr arg-ptr +1
|
||
. ie (\n[type\n[arg-ptr]] == 2) \
|
||
. as str-Mx1 \~\*[arg\n[arg-ptr]]
|
||
. el \
|
||
. nr arg-ptr -1
|
||
. \}
|
||
. ds arg\n[arg-ptr] "\*[str-Mx1]
|
||
. nr type\n[arg-ptr] 2
|
||
. ds space\n[arg-ptr] "\*[space]
|
||
. nr num-args (\n[arg-limit] - \n[arg-ptr])
|
||
. nr arg-limit \n[arg-ptr]
|
||
. if \n[num-args] \
|
||
. parse-space-vector
|
||
. print-recursive
|
||
..
|
||
. ec
|
||
. ds sP \s0
|
||
. ds tN \*[Tn-font-size]
|
||
.\}
|
||
.el \{\
|
||
. de Mx
|
||
. nr cF \\n(.f
|
||
. nr cZ \\n(.s
|
||
. ds aa \&\f\\n(cF\s\\n(cZ
|
||
. if \\n(aC==0 \{\
|
||
. ie \\n(.$==0 \&MirOS\\*(aa
|
||
. el .aV \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
|
||
. \}
|
||
. if \\n(aC>\\n(aP \{\
|
||
. nr aP \\n(aP+1
|
||
. ie \\n(C\\n(aP==2 \{\
|
||
. as b1 \&MirOS\ #\&\\*(A\\n(aP\\*(aa
|
||
. ie \\n(aC>\\n(aP \{\
|
||
. nr aP \\n(aP+1
|
||
. nR
|
||
. \}
|
||
. el .aZ
|
||
. \}
|
||
. el \{\
|
||
. as b1 \&MirOS\\*(aa
|
||
. nR
|
||
. \}
|
||
. \}
|
||
..
|
||
.\}
|
||
.\"-
|
||
.Dt LKSH 1
|
||
.Os MirBSD
|
||
.Sh NAME
|
||
.Nm lksh
|
||
.Nd Legacy Korn shell built on mksh
|
||
.Sh SYNOPSIS
|
||
.Nm
|
||
.Bk -words
|
||
.Op Fl +abCefhiklmnprUuvXx
|
||
.Op Fl +o Ar opt
|
||
.Oo
|
||
.Fl c Ar string \*(Ba
|
||
.Fl s \*(Ba
|
||
.Ar file
|
||
.Op Ar args ...
|
||
.Oc
|
||
.Ek
|
||
.Sh DESCRIPTION
|
||
.Nm
|
||
is a command interpreter intended exclusively for running legacy
|
||
shell scripts.
|
||
It is built on
|
||
.Nm mksh ;
|
||
refer to its manual page for details on the scripting language.
|
||
It is recommended to port scripts to
|
||
.Nm mksh
|
||
instead of relying on legacy or idiotic POSIX-mandated behaviour,
|
||
since the MirBSD Korn Shell scripting language is much more consistent.
|
||
.Pp
|
||
Note that it's strongly recommended to invoke
|
||
.Nm
|
||
with at least the
|
||
.Fl o Ic posix
|
||
option, if not both that
|
||
.Em and Fl o Ic sh ,
|
||
to fully enjoy better compatibility to the
|
||
.Tn POSIX
|
||
standard (which is probably why you use
|
||
.Nm
|
||
over
|
||
.Nm mksh
|
||
in the first place) or legacy scripts, respectively.
|
||
.Sh LEGACY MODE
|
||
.Nm
|
||
currently has the following differences from
|
||
.Nm mksh :
|
||
.Bl -bullet
|
||
.It
|
||
.\"XXX TODO: remove (some systems may wish to have lksh as ksh)
|
||
There is no explicit support for interactive use,
|
||
nor any command line editing or history code.
|
||
Hence,
|
||
.Nm
|
||
is not suitable as a user's login shell, either; use
|
||
.Nm mksh
|
||
instead.
|
||
.It
|
||
The
|
||
.Ev KSH_VERSION
|
||
string identifies
|
||
.Nm
|
||
as
|
||
.Dq LEGACY KSH
|
||
instead of
|
||
.Dq 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
|
||
.Xr mksh 1
|
||
for the versions this document applies to.
|
||
.It
|
||
.Nm
|
||
uses
|
||
.Tn POSIX
|
||
arithmetics, which has quite a few implications:
|
||
The data type for arithmetics is the host
|
||
.Tn ISO
|
||
C
|
||
.Vt long
|
||
data type.
|
||
Signed integer wraparound is Undefined Behaviour; this means that...
|
||
.Bd -literal -offset indent
|
||
$ echo $((2147483647 + 1))
|
||
.Ed
|
||
.Pp
|
||
\&... 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).
|
||
.It
|
||
.\"XXX TODO: move this to FPOSIX
|
||
The rotation arithmetic operators are not available.
|
||
.It
|
||
The shift arithmetic operators take all bits of the second operand into
|
||
account; if they exceed permitted precision, the result is unspecified.
|
||
.It
|
||
.\"XXX TODO: move this to FPOSIX
|
||
The
|
||
.Tn GNU
|
||
.Nm bash
|
||
extension &\*(Gt to redirect stdout and stderr in one go is not parsed.
|
||
.It
|
||
.\"XXX TODO: drop along with allowing interactivity
|
||
The
|
||
.Nm mksh
|
||
command line option
|
||
.Fl T
|
||
is not available.
|
||
.It
|
||
Unless
|
||
.Ic set -o posix
|
||
is active,
|
||
.Nm
|
||
always uses traditional mode for constructs like:
|
||
.Bd -literal -offset indent
|
||
$ set -- $(getopt ab:c "$@")
|
||
$ echo $?
|
||
.Ed
|
||
.Pp
|
||
POSIX mandates this to show 0, but traditional mode
|
||
passes through the errorlevel from the
|
||
.Xr getopt 1
|
||
command.
|
||
.It
|
||
.\"XXX TODO: move to FPOSIX/FSH
|
||
Unlike
|
||
.At
|
||
.Nm ksh ,
|
||
.Nm mksh
|
||
in
|
||
.Fl o Ic posix
|
||
or
|
||
.Fl o Ic sh
|
||
mode and
|
||
.Nm lksh
|
||
do not keep file descriptors \*(Gt 2 private from sub-processes.
|
||
.It
|
||
Functions defined with the
|
||
.Ic function
|
||
reserved word share the shell options
|
||
.Pq Ic set -o
|
||
instead of locally scoping them.
|
||
.El
|
||
.Sh SEE ALSO
|
||
.Xr mksh 1
|
||
.Pp
|
||
.Pa https://www.mirbsd.org/mksh.htm
|
||
.Pp
|
||
.Pa https://www.mirbsd.org/ksh\-chan.htm
|
||
.Sh CAVEATS
|
||
The distinction between the shell variants
|
||
.Pq Nm lksh / Nm mksh
|
||
and shell flags
|
||
.Pq Fl o Ic posix / Ic sh
|
||
will be reworked for an upcoming release.
|
||
.Pp
|
||
To use
|
||
.Nm
|
||
as
|
||
.Pa /bin/sh ,
|
||
compilation to enable
|
||
.Ic set -o posix
|
||
by default if called as
|
||
.Nm sh
|
||
is highly recommended for better standards compliance.
|
||
For better compatibility with legacy scripts, such as many
|
||
.Tn Debian
|
||
maintainer scripts, Upstart and SYSV init scripts, and other
|
||
unfixed scripts, using the compile-time options for enabling
|
||
.Em both
|
||
.Ic set -o posix -o sh
|
||
when the shell is run as
|
||
.Nm sh
|
||
is recommended.
|
||
.Pp
|
||
.Nm
|
||
tries to make a cross between a legacy bourne/posix compatibl-ish
|
||
shell and a legacy pdksh-alike but
|
||
.Dq legacy
|
||
is not exactly specified.
|
||
.Pp
|
||
The
|
||
.Ic set
|
||
built-in command does not currently have all options one would expect
|
||
from a full-blown
|
||
.Nm mksh
|
||
or
|
||
.Nm pdksh .
|
||
.Pp
|
||
Talk to the
|
||
.Mx
|
||
development team using the mailing list at
|
||
.Aq miros\-mksh@mirbsd.org
|
||
or the
|
||
.Li \&#\&!/bin/mksh
|
||
.Pq or Li \&#ksh
|
||
IRC channel at
|
||
.Pa irc.freenode.net
|
||
.Pq Port 6697 SSL, 6667 unencrypted
|
||
if you need any further quirks or assistance,
|
||
and consider migrating your legacy scripts to work with
|
||
.Nm mksh
|
||
instead of requiring
|
||
.Nm .
|