Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
MKSH(1)			    General Commands Manual		       MKSH(1)

NAME
       mksh, sh	-- MirBSD Korn shell

SYNOPSIS
       mksh  [-+abCefhiklmnprUuvXx]  [-T [!]tty	| -] [-+o option] [-c string |
	    -s | file [argument	...]]
       builtin-name [argument ...]

DESCRIPTION
       mksh is a command interpreter intended for both interactive  and	 shell
       script use.  Its	command	language is a superset of the sh(C) shell lan-
       guage  and  largely  compatible	to the original	Korn shell.  At	times,
       this manual page	may give scripting advice;  while  it  sometimes  does
       take portable shell scripting or	various	standards into account all in-
       formation  is first and foremost	presented with mksh in mind and	should
       be taken	as such.

   I use Android, OS/2,	etc. so	what...?
       Please refer to:	http://www.mirbsd.org/mksh-faq.htm#sowhatismksh

   Invocation
       Most builtins can be called directly, for example if a link points from
       its name	to the shell; not all make sense, have been tested or work  at
       all though.

       The options are as follows:

       -c string  mksh will execute the	command(s) contained in	string.

       -i	  Interactive  shell.	A shell	that reads commands from stan-
		  dard input is	"interactive" if this option  is  used	or  if
		  both	standard  input	 and  standard error are attached to a
		  tty(4).  An interactive shell	has job	control	 enabled,  ig-
		  nores	 the  SIGINT,  SIGQUIT and SIGTERM signals, and	prints
		  prompts before reading input (see the	PS1  and  PS2  parame-
		  ters).   It  also  processes the ENV parameter or the	mkshrc
		  file (see below).  For non-interactive shells, the  trackall
		  option is on by default (see the set command below).

       -l	  Login	 shell.	  If  the name or basename the shell is	called
		  with (i.e. argv[0]) starts with `-' or  if  this  option  is
		  used,	the shell is assumed to	be a login shell; see "Startup
		  files" below.

       -p	  Privileged  shell.  A	shell is "privileged" if the real user
		  ID or	group ID does not match	the effective user ID or group
		  ID (see getuid(2) and	getgid(2)).  Clearing  the  privileged
		  option  causes the shell to set its effective	user ID	(group
		  ID) to its initial real user ID (group ID).  For further im-
		  plications, see "Startup files".  If the shell is privileged
		  and this flag	is not explicitly set, the "privileged"	option
		  is cleared automatically after processing the	startup	files.

       -r	  Restricted shell.  A shell is	"restricted" if	 the  basename
		  the  shell is	called with, after `-' processing, starts with
		  `r' or if this option	is used.  The  following  restrictions
		  come	into  effect after the shell processes any profile and
		  ENV files:

		     The cd (and chdir) command is disabled.
		     The SHELL, ENV and PATH parameters cannot	be changed.
		     Command names can't be specified with absolute or	 rela-
		      tive paths.
		     The  -p  option of the built-in command command can't be
		      used.
		     Redirections that	create files can't be used (i.e.  ">",
		      ">|", ">>", "<>").

       -s	  The shell reads commands from	standard input;	all non-option
		  arguments are	positional parameters.

       -T name	  Spawn	 mksh  on  the	tty(4)	device given.  The paths name,
		  /dev/ttyCname	and /dev/ttyname are attempted in order.   Un-
		  less	name  begins  with  an exclamation mark	(`!'), this is
		  done in a subshell and returns immediately.  If  name	 is  a
		  dash (`-'), detach from controlling terminal (daemonise) in-
		  stead.

       In  addition  to	 the  above, the options described in the set built-in
       command can also	be used	on the command	line:  both  [-+abCefhkmnuvXx]
       and [-+o	option]	can be used for	single letter or long options, respec-
       tively.

       If  neither the -c nor the -s option is specified, the first non-option
       argument	specifies the name of a	file the shell	reads  commands	 from.
       If there	are no non-option arguments, the shell reads commands from the
       standard	input.	The name of the	shell (i.e. the	contents of $0)	is de-
       termined	as follows: if the -c option is	used and there is a non-option
       argument,  it  is  used	as the name; if	commands are being read	from a
       file, the file is used as the name; otherwise, the name the  shell  was
       called with (i.e. argv[0]) is used.

       The  exit  status  of the shell is 127 if the command file specified on
       the command line	could not be opened, or	non-zero if a fatal syntax er-
       ror occurred during the execution of a script.  In the absence of fatal
       errors, the exit	status is that of the last command executed,  or  zero
       if no command is	executed.

   Startup files
       For  the	 actual	 location  of these files, see "FILES".	 A login shell
       processes the system profile first.  A privileged shell then  processes
       the suid	profile.  A non-privileged login shell processes the user pro-
       file  next.  A non-privileged interactive shell checks the value	of the
       ENV parameter after subjecting it to parameter, command,	arithmetic and
       tilde (`~') substitution; if unset or empty, the	user mkshrc profile is
       processed; otherwise, if	a file whose name is the  substitution	result
       exists,	it  is processed; non-existence	is silently ignored.  A	privi-
       leged shell then	drops privileges if neither was	the -p option given on
       the command line	nor set	during execution of the	startup	files.

   Command syntax
       The shell begins	parsing	its input by  removing	any  backslash-newline
       combinations,  then breaking it into words.  Words (which are sequences
       of characters) are delimited by unquoted	whitespace characters  (space,
       tab  and	 newline) or meta-characters (`<', `>',	`|', `;', `(', `)' and
       `&').  Aside from delimiting words, spaces and tabs are ignored,	 while
       newlines	 usually  delimit  commands.   The meta-characters are used in
       building	the following tokens: "<", "<&", "<<", "<<<", ">", ">&", ">>",
       "&>",  etc.  are	 used  to  specify  redirections  (see	 "Input/output
       redirection"  below);  "|" is used to create pipelines; "|&" is used to
       create co-processes (see	"Co-processes" below); ";" is used to separate
       commands; "&" is	used to	create asynchronous pipelines; "&&"  and  "||"
       are used	to specify conditional execution; ";;",	";&" and ";|" are used
       in  case	statements; "((	... ))"	is used	in arithmetic expressions; and
       lastly, "( ... )" is used to create subshells.

       Whitespace and meta-characters can be quoted individually using a back-
       slash (`\'), or in groups using double (`"') or	single	("'")  quotes.
       Note  that  the	following characters are also treated specially	by the
       shell and must be quoted	if they	are to represent themselves: `\', `"',
       "'", `#', `$', ``', `~',	`{', `}', `*', `?' and `['.  The  first	 three
       of  these are the above mentioned quoting characters (see "Quoting" be-
       low); `#', if used at the  beginning  of	 a  word,  introduces  a  com-
       ment - everything  after	 the `#' up to the nearest newline is ignored;
       `$' is used to introduce	parameter, command  and	 arithmetic  substitu-
       tions  (see  "Substitution" below); ``' introduces an old-style command
       substitution (see "Substitution"	below);	`~' begins a directory	expan-
       sion  (see  "Tilde  expansion" below); `{' and `}' delimit csh(1)-style
       alternations (see "Brace	expansion" below); and finally,	`*',  `?'  and
       `[' are used in file name generation (see "File name patterns" below).

       As  words  and  tokens  are parsed, the shell builds commands, of which
       there are two basic types: simple-commands, typically  programmes  that
       are  executed,  and  compound-commands,	such as	for and	if statements,
       grouping	constructs and function	definitions.

       A simple-command	consists of some combination of	parameter  assignments
       (see  "Parameters" below), input/output redirections (see "Input/output
       redirections" below) and	command	words; the only	 restriction  is  that
       parameter  assignments  come  before  any  command  words.  The command
       words, if any, define the command that is to be executed	and its	 argu-
       ments.	The  command may be a shell built-in command, a	function or an
       external	command	(i.e. a	separate executable file that is located using
       the PATH	parameter; see "Command	execution" below).  Note that all com-
       mand constructs have an exit status: for	external commands, this	is re-
       lated to	the status returned by wait(2) (if the command	could  not  be
       found,  the  exit  status is 127; if it could not be executed, the exit
       status is 126); the exit	status of other	command	 constructs  (built-in
       commands, functions, compound-commands, pipelines, lists, etc.) are all
       well-defined  and  are described	where the construct is described.  The
       exit status of a	command	consisting only	of  parameter  assignments  is
       that  of	 the  last command substitution	performed during the parameter
       assignment or 0 if there	were no	command	substitutions.

       Commands	can be chained together	using the "|" token to form pipelines,
       in which	the standard output of each command but	the last is piped (see
       pipe(2))	to the standard	input of the following command.	 The exit sta-
       tus of a	pipeline is that of its	last command, unless the pipefail  op-
       tion  is	 set  (see there).  All	commands of a pipeline are executed in
       separate	subshells; this	is allowed by  POSIX  but  differs  from  both
       variants	of AT&T	UNIX ksh, where	all but	the last command were executed
       in  subshells;  see the read builtin's description for implications and
       workarounds.  A pipeline	may be prefixed	by the "!" reserved word which
       causes the exit status of the pipeline to be logically complemented: if
       the original status was 0, the complemented status will be  1;  if  the
       original	status was not 0, the complemented status will be 0.

       Lists  of commands can be created by separating pipelines by any	of the
       following tokens: "&&", "||", "&", "|&" and ";".	 The first two are for
       conditional execution: "cmd1 && cmd2" executes cmd2 only	 if  the  exit
       status of cmd1 is zero; "||" is the opposite - cmd2 is executed only if
       the  exit  status of cmd1 is non-zero.  "&&" and	"||" have equal	prece-
       dence which is higher than that of "&", "|&" and	";", which  also  have
       equal   precedence.    Note  that  the  "&&"  and  "||"	operators  are
       "left-associative".  For	example, both of  these	 commands  will	 print
       only "bar":

	     $ false &&	echo foo || echo bar
	     $ true || echo foo	&& echo	bar

       The  "&"	 token	causes	the preceding command to be executed asynchro-
       nously; that is,	the shell starts the command but does not wait for  it
       to  complete  (the  shell does keep track of the	status of asynchronous
       commands; see "Job control" below).  When an  asynchronous  command  is
       started	when  job control is disabled (i.e. in most scripts), the com-
       mand is started with signals SIGINT and SIGQUIT ignored and with	 input
       redirected from /dev/null (however, redirections	specified in the asyn-
       chronous	 command  have	precedence).   The  "|&" operator starts a co-
       process	which  is  a  special  kind  of	 asynchronous	process	  (see
       "Co-processes"  below).	 Note  that a command must follow the "&&" and
       "||" operators, while it	need not follow	"&", "|&" or  ";".   The  exit
       status  of a list is that of the	last command executed, with the	excep-
       tion of asynchronous lists, for which the exit status is	0.

       Compound	commands are  created  using  the  following  reserved	words.
       These  words  are  only recognised if they are unquoted and if they are
       used as the first word of a command (i.e. they can't be preceded	by pa-
       rameter assignments or redirections):

	     case     else     function	    then      !	      (
	     do	      esac     if	    time      [[      ((
	     done     fi       in	    until     {
	     elif     for      select	    while     }

       In the following	compound command descriptions, command lists  (denoted
       as list)	that are followed by reserved words must end with a semicolon,
       a newline or a (syntactically correct) reserved word.  For example, the
       following are all valid:

	     $ { echo foo; echo	bar; }
	     $ { echo foo; echo	bar<newline>}
	     $ { { echo	foo; echo bar; } }

       This is not valid:

	     $ { echo foo; echo	bar }

       case word in [[(] pattern [| pattern] ...) list <terminator>] ... esac
	     The  case	statement  attempts  to	match word against a specified
	     pattern; the list associated with the first successfully  matched
	     pattern  is  executed.   Patterns used in case statements are the
	     same as those used	for file name patterns	except	that  the  re-
	     strictions	 regarding `.' and `/' are dropped.  Note that any un-
	     quoted space before and after a pattern is	 stripped;  any	 space
	     within  a pattern must be quoted.	Both the word and the patterns
	     are subject to parameter, command and arithmetic substitution, as
	     well as tilde substitution.

	     For historical reasons, open and close braces may be used instead
	     of	in and esac, for example: "case	$foo { (ba[rz]|blah)  date  ;;
	     }"

	     The list <terminator>s are:

	     ";;"  Terminate after the list.

	     ";&"  Fall	through	into the next list.

	     ";|"  Evaluate the	remaining pattern-list tuples.

	     The exit status of	a case statement is that of the	executed list;
	     if	no list	is executed, the exit status is	zero.

       for name	[in word ...] ;	do list; done
	     For  each	word in	the specified word list, the parameter name is
	     set to the	word and list is executed.  The	exit status of	a  for
	     statement	is the last exit status	of list; if list is never exe-
	     cuted, the	exit status is zero.  If in is not used	to  specify  a
	     word  list, the positional	parameters ($1,	$2, etc.) are used in-
	     stead; in this case, use a	newline	instead	of the semicolon (`;')
	     for portability.  For historical reasons, open and	 close	braces
	     may  be  used instead of do and done, as in "for i; { echo	$i; }"
	     (not portable).

       function	name { list; }
	     Defines the function name (see "Functions"	below).	 All  redirec-
	     tions  specified  after a function	definition are performed when-
	     ever the function is executed, not	when the  function  definition
	     is	executed.

       name() command
	     Mostly  the  same	as function (see above and "Functions" below).
	     Most amounts of space and tab after name will be ignored.

       function	name() { list; }
	     bashism for name()	{ list;	} (the function	keyword	is ignored).

       if list;	then list; [elif list; then list;] ... [else list;] fi
	     If	the exit status	of the first list is zero, the second list  is
	     executed; otherwise, the list following the elif, if any, is exe-
	     cuted  with similar consequences.	If all the lists following the
	     if	and elifs fail (i.e. exit with non-zero	status), the list fol-
	     lowing the	else is	executed.  The exit status of an if  statement
	     is	 that of whatever non-conditional (not the first) list that is
	     executed; if no non-conditional list is executed, the exit	status
	     is	zero.

       select name [in word ...]; do list; done
	     The select	statement provides an automatic	method	of  presenting
	     the  user	with a menu and	selecting from it.  An enumerated list
	     of	the specified words is printed on standard error, followed  by
	     a prompt (PS3: normally "#? ").  A	number corresponding to	one of
	     the  enumerated  words  is	then read from standard	input, name is
	     set to the	selected word  (or  unset  if  the  selection  is  not
	     valid), REPLY is set to what was read (leading and	trailing space
	     is	 stripped),  and list is executed.  If a blank line (i.e. zero
	     or	more IFS octets) is entered, the menu is reprinted without ex-
	     ecuting list.

	     When list completes, the enumerated list is printed if  REPLY  is
	     empty,  the prompt	is printed, and	so on.	This process continues
	     until an end-of-file is read, an  interrupt  is  received,	 or  a
	     break  statement is executed inside the loop.  The	exit status of
	     a select statement	is zero	if a break statement is	used  to  exit
	     the  loop,	 non-zero otherwise.  If "in word ..." is omitted, the
	     positional	parameters are used.  For historical reasons, open and
	     close braces may be used instead of do and	done, as  in:  "select
	     i;	{ echo $i; }"

       time [-p] [pipeline]
	     The "Command execution" section describes the time	reserved word.

       until list; do list; done
	     This  works  like while (see below), except that the body list is
	     executed only while the exit status of the	 first	list  is  non-
	     zero.

       while list; do list; done
	     A	while is a pre-checked loop.  Its body list is executed	as of-
	     ten as the	exit status of the first list is zero.	The exit  sta-
	     tus  of  a	while statement	is the last exit status	of the list in
	     the body of the loop; if the body is not executed,	the exit  sta-
	     tus is zero.

       [[ expression ]]
	     Similar  to the test and [	... ] commands (described later), with
	     the following exceptions:

	     	 Field splitting and globbing are not performed	on arguments.

	     	 The -a	(AND) and -o  (OR)  operators  are  replaced,  respec-
		 tively, with "&&" and "||".

	     	 Operators (e.g. "-f", "=", "!") must be unquoted.

	     	 Parameter, command and	arithmetic substitutions are performed
		 as  expressions  are evaluated	and lazy expression evaluation
		 is used for the "&&" and "||" operators.  This	means that  in
		 the  following	statement, $(<foo) is evaluated	if and only if
		 the file foo exists and is readable:

		       $ [[ -r foo && $(<foo) =	b*r ]]

	     	 The second operand of the "=" and "!="	expressions is a  pat-
		 tern (e.g. the	comparison [[ foobar = f*r ]] succeeds).  This
		 even works indirectly,	while quoting forces literal interpre-
		 tation:

		       $ bar=foobar; baz='f*r'	       # or: baz='f+(o)b?r'
		       $ [[ $bar = $baz	]]; echo $?    # 0
		       $ [[ $bar = "$baz" ]]; echo $?  # 1

       { list; }
	     Compound construct; list is executed, but not in a	subshell.
	     Note that "{" and "}" are reserved	words, not meta-characters.

       (list)
	     Execute list in a subshell, forking.  There is no implicit	way to
	     pass environment changes from a subshell back to its parent.

       (( expression ))
	     The  arithmetic expression	expression is evaluated; equivalent to
	     `let "expression"'	in a compound construct.
	     See the let command and "Arithmetic expressions" below.

   Quoting
       Quoting is used to prevent the shell from treating characters or	 words
       specially.   There are three methods of quoting.	 First,	`\' quotes the
       following character, unless it is at the	end of a line, in  which  case
       both  the  `\'  and  the	 newline are stripped.	Second,	a single quote
       ("'") quotes everything up to the next  single  quote  (this  may  span
       lines).	Third, a double	quote (`"') quotes all characters, except `$',
       `\' and ``', up to the next unescaped double quote.  `$'	and ``'	inside
       double  quotes  have their usual	meaning	(i.e. parameter, arithmetic or
       command substitution) except no field splitting is carried out  on  the
       results	of double-quoted substitutions,	and the	old-style form of com-
       mand substitution has backslash-quoting for double quotes enabled.   If
       a  `\'  inside  a  double-quoted	string is followed by `"', `$',	`\' or
       ``', only the `\' is removed, i.e. the combination is replaced  by  the
       second  character; if it	is followed by a newline, both the `\' and the
       newline are stripped; otherwise,	both the `\' and the character follow-
       ing are unchanged.

       If a single-quoted string is preceded by	an unquoted `$', C style back-
       slash expansion (see below) is applied (even  single  quote  characters
       inside  can  be	escaped	and do not terminate the string	then); the ex-
       panded result is	treated	as any other single-quoted string.  If a  dou-
       ble-quoted string is preceded by	an unquoted `$', the `$' is simply ig-
       nored.

   Backslash expansion
       In  places  where backslashes are expanded, certain C and AT&T UNIX ksh
       or GNU bash style escapes are translated.  These	 include  "\a",	 "\b",
       "\f",   "\n",   "\r",  "\t",  "\U########",  "\u####"  and  "\v".   For
       "\U########" and	"\u####", `#' means a hexadecimal digit	(up  to	 4  or
       8);  these translate a Universal	Coded Character	Set codepoint to UTF-8
       (see "CAVEATS" on UCS limitations).  Furthermore, "\E" and "\e"	expand
       to the escape character.

       In the print builtin mode, octal	sequences must have the	optional up to
       three octal digits `#' prefixed with the	digit zero ("\0###"); hexadec-
       imal  sequences "\x##" are limited to up	to two hexadecimal digits `#';
       both octal and hexadecimal sequences convert to raw octets; "\%", where
       `%' is none of the above, translates to \% (backslashes are retained).

       In C style mode,	raw octet-yielding octal  sequences  "\###"  must  not
       have  the  one  up  to three octal digits prefixed with the digit zero;
       hexadecimal sequences "\x##" greedily eat up as many hexadecimal	digits
       `#' as they can and terminate with the first  non-xdigit;  below	 \x100
       these produce raw octets; above,	they are equivalent to "\U#".  The se-
       quence  "\c%",  where  `%' is any octet,	translates to Ctrl-%, that is,
       "\c?" becomes DEL, everything else is bitwise ANDed with	 0x9F.	 "\%",
       where  `%'  is  none  of	 the  above,  translates to %: backslashes are
       trimmed even before newlines.

   Aliases
       There are two types of aliases:	normal	command	 aliases  and  tracked
       aliases.	  Command aliases are normally used as a short hand for	a long
       or often	used command.  The shell expands command aliases (i.e. substi-
       tutes the alias name for	its value) when	it reads the first word	 of  a
       command.	  An expanded alias is re-processed to check for more aliases.
       If a command alias ends in a space or tab, the following	word  is  also
       checked	for alias expansion.  The alias	expansion process stops	when a
       word that is not	an alias is found, when	a quoted  word	is  found,  or
       when  an	alias word that	is currently being expanded is found.  Aliases
       are specifically	an interactive feature:	while they do happen  to  work
       in  scripts and on the command line in some cases, aliases are expanded
       during lexing, so their use must	be in a	 separate  command  tree  from
       their  definition; otherwise, the alias will not	be found.  Noticeably,
       command lists (separated	by semicolon, in command substitutions also by
       newline)	may be one same	parse tree.

       The following command aliases are defined automatically by the shell:

	     autoload='\\builtin typeset -fu'
	     functions='\\builtin typeset -f'
	     hash='\\builtin alias -t'
	     history='\\builtin	fc -l'
	     integer='\\builtin	typeset	-i'
	     local='\\builtin typeset'
	     login='\\builtin exec login'
	     nameref='\\builtin	typeset	-n'
	     nohup='nohup '
	     r='\\builtin fc -e	-'
	     type='\\builtin whence -v'

       Tracked aliases allow the shell to remember where it found a particular
       command.	 The first time	the shell does a path  search  for  a  command
       that  is	 marked	as a tracked alias, it saves the full path of the com-
       mand.  The next time the	command	is  executed,  the  shell  checks  the
       saved  path  to see that	it is still valid, and if so, avoids repeating
       the path	search.	 Tracked aliases can be	listed and created using alias
       -t.  Note that changing the PATH	parameter clears the saved  paths  for
       all  tracked  aliases.	If  the	 trackall  option  is set (i.e.	set -o
       trackall	or set -h), the	shell tracks all commands.  This option	is set
       automatically for non-interactive shells.  For interactive shells, only
       the  following  commands	 are  automatically  tracked:  cat(1),	cc(1),
       chmod(1),  cp(1),  date(1),  ed(1),  emacs(1), grep(1), ls(1), make(1),
       mv(1), pr(1), rm(1), sed(1), sh(1), vi(1) and who(1).

   Substitution
       The first step the shell	takes in executing a simple-command is to per-
       form substitutions on the words of the command.	There are three	 kinds
       of  substitution: parameter, command and	arithmetic.  Parameter substi-
       tutions,	which are described in detail in the next  section,  take  the
       form $name or ${...}; command substitutions take	the form $(command) or
       (deprecated)   `command`	 or  (executed	in  the	 current  environment)
       ${ command;} and	strip trailing newlines; and arithmetic	 substitutions
       take the	form $((expression)).  Parsing the current-environment command
       substitution  requires  a space,	tab or newline after the opening brace
       and that	the closing brace be recognised	as a keyword (i.e. is preceded
       by a newline or semicolon).  They are  also  called  funsubs  (function
       substitutions) and behave like functions	in that	local and return work,
       and in that exit	terminates the parent shell; shell options are shared.

       Another	variant	 of substitution are the valsubs (value	substitutions)
       ${|command;} which are also executed in the current  environment,  like
       funsubs,	but share their	I/O with the parent; instead, they evaluate to
       whatever	 the,  initially empty,	expression-local variable REPLY	is set
       to within the commands.

       If a substitution appears outside of double quotes, the results of  the
       substitution are	generally subject to word or field splitting according
       to the current value of the IFS parameter.  The IFS parameter specifies
       a  list	of  octets  which  are	used to	break a	string up into several
       words; any octets from the set space, tab and newline  that  appear  in
       the  IFS	 octets	are called "IFS	whitespace".  Sequences	of one or more
       IFS whitespace octets, in combination with zero or one  non-IFS	white-
       space octets, delimit a field.  As a special case, leading and trailing
       IFS  whitespace is stripped (i.e. no leading or trailing	empty field is
       created by it); leading or trailing non-IFS whitespace does  create  an
       empty field.

       Example:	  If   IFS   is	  set	to   "<space>:"	 and  VAR  is  set  to
       "<space>A<space>:<space><space>B::D", the substitution for $VAR results
       in four fields: "A", "B", "" (an	empty field) and "D".	Note  that  if
       the  IFS	 parameter  is	set to the empty string, no field splitting is
       done; if	it is unset, the default value of space, tab  and  newline  is
       used.

       Also,  note  that the field splitting applies only to the immediate re-
       sult of the substitution.  Using	the previous example, the substitution
       for $VAR:E results in the fields: "A", "B", "" and "D:E", not "A", "B",
       "", "D" and "E".	 This behavior is POSIX	 compliant,  but  incompatible
       with  some  other shell implementations which do	field splitting	on the
       word which contained the	substitution or	use IFS	as  a  general	white-
       space delimiter.

       The  results of substitution are, unless	otherwise specified, also sub-
       ject to brace expansion and file	name expansion (see the	relevant  sec-
       tions below).

       A command substitution is replaced by the output	generated by the spec-
       ified  command  which  is  run  in  a  subshell.	  For  $(command)  and
       ${|command;} and	${ command;} substitutions, normal quoting  rules  are
       used  when  command  is	parsed;	 however, for the deprecated `command`
       form, a `\' followed by any of `$', ``' or `\' is stripped (as  is  `"'
       when  the  substitution is part of a double-quoted string); a backslash
       `\' followed by any other character is unchanged.  As a special case in
       command substitutions, a	command	of the form <file  is  interpreted  to
       mean  substitute	 the contents of file.	Note that $(<foo) has the same
       effect as $(cat foo).

       Note that some shells do	not use	a recursive parser for command substi-
       tutions,	leading	to failure for certain constructs; to be portable, use
       as workaround "x=$(cat) <<\EOF" (or the newline-keeping "x=<<\EOF"  ex-
       tension)	  instead  to  merely  slurp  the  string.   IEEE  Std	1003.1
       ("POSIX.1") recommends using case statements of the form	x=$(case  $foo
       in  (bar) echo $bar ;; (*) echo $baz ;; esac) instead, which would work
       but not serve as	example	for this portability issue.

	     x=$(case $foo in bar) echo	$bar ;;	*) echo	$baz ;;	esac)
	     # above fails to parse on old shells; below is the	workaround
	     x=$(eval $(cat)) <<\EOF
	     case $foo in bar) echo $bar ;; *) echo $baz ;; esac
	     EOF

       Arithmetic substitutions	are replaced by	the value of the specified ex-
       pression.  For example, the command print $((2+3*4)) displays 14.   See
       "Arithmetic expressions"	for a description of an	expression.

   Parameters
       Parameters  are	shell variables; they can be assigned values and their
       values can be accessed using a  parameter  substitution.	  A  parameter
       name is either one of the special single	punctuation or digit character
       parameters  described  below, or	a letter followed by zero or more let-
       ters or digits (`_' counts as  a	 letter).   The	 latter	 form  can  be
       treated	as arrays by appending an array	index of the form [expr] where
       expr is an arithmetic expression.  Array	indices	in mksh	are limited to
       the range 0 through 4294967295, inclusive.  That	is, they are a	32-bit
       unsigned	integer.

       Parameter  substitutions	 take the form $name, ${name} or ${name[expr]}
       where name is a parameter name.	Substitutions of an  array  in	scalar
       context,	 i.e.  without an expr in the latter form mentioned above, ex-
       pand the	element	with the key "0".  Substitution	of all array  elements
       with  ${name[*]}	and ${name[@]} works equivalent	to $* and $@ for posi-
       tional parameters.  If substitution is performed	on a parameter (or  an
       array  parameter	 element)  that	is not set, an empty string is substi-
       tuted unless the	nounset	option (set -u)	is set,	in which case an error
       occurs.

       Parameters can be assigned values in a  number  of  ways.   First,  the
       shell  implicitly sets some parameters like "#",	"PWD" and "$"; this is
       the only	way the	special	single character parameters are	set.   Second,
       parameters  are	imported  from	the  shell's  environment  at startup.
       Third, parameters can be	assigned values	on the command line: for exam-
       ple, FOO=bar sets the parameter "FOO" to	"bar"; multiple	parameter  as-
       signments  can  be  given on a single command line and they can be fol-
       lowed by	a simple-command, in which case	the assignments	are in	effect
       only  for  the  duration	 of the	command	(such assignments are also ex-
       ported; see below for the implications of this).	 Note  that  both  the
       parameter  name and the `=' must	be unquoted for	the shell to recognise
       a parameter assignment.	The construct FOO+=baz is also recognised; the
       old and new values are  string-concatenated  with  no  separator.   The
       fourth  way  of	setting	 a  parameter is with the export, readonly and
       typeset commands; see their descriptions	 in  the  "Command  execution"
       section.	  Fifth,  for  and  select loops set parameters	as well	as the
       getopts,	read and set -A	commands.  Lastly, parameters can be  assigned
       values  using  assignment  operators inside arithmetic expressions (see
       "Arithmetic expressions"	below) or using	the ${name=value} form of  the
       parameter substitution (see below).

       Parameters  with	 the export attribute (set using the export or typeset
       -x commands, or by parameter assignments	followed by  simple  commands)
       are  put	 in  the  environment  (see environ(7))	of commands run	by the
       shell as	name=value pairs.  The order in	which parameters appear	in the
       environment of a	command	is unspecified.	 When the shell	starts up,  it
       extracts	parameters and their values from its environment and automati-
       cally sets the export attribute for those parameters.

       Modifiers can be	applied	to the ${name} form of parameter substitution:

       ${name:-word}
	       If  name	 is  set  and not empty, it is substituted; otherwise,
	       word is substituted.

       ${name:+word}
	       If name is set and not empty, word is  substituted;  otherwise,
	       nothing is substituted.

       ${name:=word}
	       If  name	is set and not empty, it is substituted; otherwise, it
	       is assigned word	and the	resulting value	 of  name  is  substi-
	       tuted.

       ${name:?word}
	       If  name	 is  set  and not empty, it is substituted; otherwise,
	       word is printed on standard error (preceded by  name:)  and  an
	       error  occurs  (normally	causing	termination of a shell script,
	       function, or a script sourced using the "." built-in).  If word
	       is omitted, the string "parameter null or not set" is used  in-
	       stead.

       Note  that,  for	 all of	the above, word	is actually considered quoted,
       and special parsing rules apply.	 The  parsing  rules  also  differ  on
       whether	the expression is double-quoted: word then uses	double-quoting
       rules, except for the double quote itself (`"') and the closing	brace,
       which, if backslash escaped, gets quote removal applied.

       In  the above modifiers,	the `:'	can be omitted,	in which case the con-
       ditions only depend on name being  set  (as  opposed  to	 set  and  not
       empty).	 If  word  is needed, parameter, command, arithmetic and tilde
       substitution are	performed on it; if word is  not  needed,  it  is  not
       evaluated.

       The following forms of parameter	substitution can also be used:

       ${#name}
	       The  number of positional parameters if name is "*", "@"	or not
	       specified; otherwise the	length (in characters) of  the	string
	       value of	parameter name.

       ${#name[*]}
       ${#name[@]}
	       The number of elements in the array name.

       ${%name}
	       The  width (in screen columns) of the string value of parameter
	       name, or	-1 if ${name} contains a control character.

       ${!name}
	       The name	of the variable	referred to by	name.	This  will  be
	       name  except  when  name	 is a name reference (bound variable),
	       created by the nameref command (which is	an alias  for  typeset
	       -n).   name  cannot  be one of most special parameters (see be-
	       low).

       ${!name[*]}
       ${!name[@]}
	       The names of indices (keys) in the array	name.

       ${name#pattern}
       ${name##pattern}
	       If pattern matches the beginning	 of  the  value	 of  parameter
	       name,  the matched text is deleted from the result of substitu-
	       tion.  A	single `#' results in the shortest match, and  two  of
	       them result in the longest match.

       ${name%pattern}
       ${name%%pattern}
	       Like ${...#...} but deletes from	the end	of the value.

       ${name/pattern/string}
       ${name/#pattern/string}
       ${name/%pattern/string}
       ${name//pattern/string}
	       The  longest match of pattern in	the value of parameter name is
	       replaced	with string (deleted if	string is empty; the  trailing
	       slash (`/') may be omitted in that case).  A leading slash fol-
	       lowed  by  `#'  or `%' causes the pattern to be anchored	at the
	       beginning or end	of the value, respectively;  empty  unanchored
	       patterns	cause no replacement; a	single leading slash or	use of
	       a  pattern that matches the empty string	causes the replacement
	       to happen only once; two	leading	slashes	cause all  occurrences
	       of  matches  in	the value to be	replaced.  May be slow on long
	       strings.

       ${name@/pattern/string}
	       The same	as ${name//pattern/string}, except that	 both  pattern
	       and  string  are	 expanded  anew	 for each iteration.  Use with
	       KSH_MATCH.

       ${name:pos:len}
	       The first len characters	of name, starting at position pos, are
	       substituted.  Both pos and :len are optional.  If pos is	 nega-
	       tive,  counting starts at the end of the	string;	if it is omit-
	       ted, it defaults	to 0.  If len is omitted or greater  than  the
	       length of the remaining string, all of it is substituted.  Both
	       pos and len are evaluated as arithmetic expressions.

       ${name@#}
	       The  hash  (using the BAFH algorithm) of	the expansion of name.
	       This is also used internally for	the shell's hashtables.

       ${name@Q}
	       A quoted	expression safe	for re-entry, whose value is the value
	       of the name parameter, is substituted.

       Note that pattern may need extended globbing pattern  (@(...)),	single
       ('...') or double ("...") quote escaping	unless -o sh is	set.

       The  following  special	parameters are implicitly set by the shell and
       cannot be set directly using assignments:

       !       Process ID of the last background process started.  If no back-
	       ground processes	have been started, the parameter is not	set.

       #       The number of positional	parameters ($1,	$2, etc.).

       $       The PID of the shell or,	if it is a subshell, the  PID  of  the
	       original	 shell.	 Do NOT	use this mechanism for generating tem-
	       porary file names; see mktemp(1)	instead.

       -       The concatenation of the	current	single letter options (see the
	       set command below for a list of options).

       ?       The exit	status of the last non-asynchronous command  executed.
	       If  the	last  command was killed by a signal, $? is set	to 128
	       plus the	signal number, but at most 255.

       0       The name	of the shell, determined as follows: the  first	 argu-
	       ment to mksh if it was invoked with the -c option and arguments
	       were given; otherwise the file argument,	if it was supplied; or
	       else the	name the shell was invoked with	(i.e. argv[0]).	 $0 is
	       also  set  to the name of the current script, or	to the name of
	       the current function if it was defined with the	function  key-
	       word (i.e. a Korn shell style function).

       1 .. 9  The  first nine positional parameters that were supplied	to the
	       shell, function,	or script  sourced  using  the	"."  built-in.
	       Further positional parameters may be accessed using ${number}.

       *       All positional parameters (except 0), i.e. $1, $2, $3, ...
	       If used outside of double quotes, parameters are	separate words
	       (which  are subjected to	word splitting); if used within	double
	       quotes, parameters are separated	by the first character of  the
	       IFS parameter (or the empty string if IFS is unset.

       @       Same  as	 $*,  unless it	is used	inside double quotes, in which
	       case a separate word is generated for each  positional  parame-
	       ter.   If there are no positional parameters, no	word is	gener-
	       ated.  "$@" can be used to access arguments, verbatim,  without
	       losing empty arguments or splitting arguments with spaces (IFS,
	       actually).

       The following parameters	are set	and/or used by the shell:

       _	    (underscore)  When	an external command is executed	by the
		    shell, this	parameter is set in the	environment of the new
		    process to the path	of the executed	command.  In  interac-
		    tive  use,	this parameter is also set in the parent shell
		    to the last	word of	the previous command.

       BASHPID	    The	PID of the shell or subshell.

       CDPATH	    Like PATH, but used	to resolve  the	 argument  to  the  cd
		    built-in command.  Note that if CDPATH is set and does not
		    contain "."	or an empty string element, the	current	direc-
		    tory  is not searched.  Also, the cd built-in command will
		    display the	resulting directory when a match is  found  in
		    any	search path other than the empty path.

       COLUMNS	    Set	 to  the  number of columns on the terminal or window.
		    If never unset and not imported, always  set  dynamically;
		    unless  the	 value	as reported by stty(1) is non-zero and
		    sane enough	(minimum is 12x3), defaults to 80; similar for
		    LINES.  This parameter is used  by	the  interactive  line
		    editing  modes  and	by the select, set -o and kill -l com-
		    mands to format information	columns.  Importing  from  the
		    environment	 or unsetting this parameter removes the bind-
		    ing	to the actual terminal size in favour of the  provided
		    value.

       ENV	    If	this  parameter	 is  found to be set after any profile
		    files are executed,	the expanded value is used as a	 shell
		    startup  file.   It	 typically contains function and alias
		    definitions.

       EPOCHREALTIME
		    Time since the epoch, as returned by gettimeofday(2), for-
		    matted as decimal tv_sec  followed	by  a  dot  (`.')  and
		    tv_usec padded to exactly six decimal digits.

       EXECSHELL    If	set,  this  parameter  is assumed to contain the shell
		    that is to be used	to  execute  commands  that  execve(2)
		    fails  to  execute and which do not	start with a "#!shell"
		    sequence.

       FCEDIT	    The	editor used by the fc command (see below).

       FPATH	    Like PATH, but used	when an	undefined function is executed
		    to locate the file defining	 the  function.	  It  is  also
		    searched  when  a  command can't be	found using PATH.  See
		    "Functions"	below for more information.

       HISTFILE	    The	name of	the file used to store command history.	  When
		    assigned to	or unset, the file is opened, history is trun-
		    cated  then	 loaded	from the file; subsequent new commands
		    (possibly consisting of several lines) are	appended  once
		    they  successfully compiled.  Also,	several	invocations of
		    the	shell will share history if their HISTFILE  parameters
		    all	point to the same file.

		    Note:  If  HISTFILE	 is unset or empty, no history file is
		    used.  This	is different from AT&T UNIX ksh.

       HISTSIZE	    The	number of commands normally stored for	history.   The
		    default is 2047.  The maximum is 65535.

       HOME	    The	 default  directory  for  the cd command and the value
		    substituted	for an unqualified ~  (see  "Tilde  expansion"
		    below).

       IFS	    Internal  field separator, used during substitution	and by
		    the	read command, to split values into distinct arguments;
		    normally   set   to	  space,   tab	 and   newline.	   See
		    "Substitution" above for details.

		    Note:  This	parameter is not imported from the environment
		    when the shell is started.

       KSHEGID	    The	effective group	id of the shell	at startup.

       KSHGID	    The	real group id of the shell at startup.

       KSHUID	    The	real user id of	the shell at startup.

       KSH_MATCH    The	last matched string.  In a future version,  this  will
		    be	an  indexed  array,  with  indexes  1 and up capturing
		    matching groups.  Set by string comparisons	(= and !=)  in
		    double-bracket  test  expressions  when  a	match is found
		    (when != returns false), by	case when a match  is  encoun-
		    tered,   and  by  the  substitution	 operations  ${x#pat},
		    ${x##pat},	   ${x%pat},	 ${x%%pat},	 ${x/pat/rpl},
		    ${x/#pat/rpl},     ${x/%pat/rpl},	 ${x//pat/rpl},	   and
		    ${x@/pat/rpl}.  See	the end	of the Emacs editing mode doc-
		    umentation for an example.

       KSH_VERSION  The	name (self-identification) and version	of  the	 shell
		    (read-only).   See	also  the  version  commands in	"Emacs
		    editing mode" and "Vi editing mode"	sections, below.

       LINENO	    The	line number of the function or shell  script  that  is
		    currently being executed.

       LINES	    Set	to the number of lines on the terminal or window.  De-
		    faults  to	24; always set,	unless imported	or unset.  See
		    COLUMNS.

       OLDPWD	    The	previous working directory.  Unset if cd has not  suc-
		    cessfully  changed	directories since the shell started or
		    if the shell doesn't know where it is.

       OPTARG	    When using getopts,	it contains the	argument for a	parsed
		    option, if it requires one.

       OPTIND	    The	 index of the next argument to be processed when using
		    getopts.  Assigning	1 to this parameter causes getopts  to
		    process  arguments	from the beginning the next time it is
		    invoked.

       PATH	    A colon (semicolon on OS/2)	separated list of  directories
		    that  are  searched	 when  looking	for commands and files
		    sourced using the  "."  command  (see  below).   An	 empty
		    string  resulting  from a leading or trailing (semi)colon,
		    or two adjacent ones, is treated as	a "." (the current di-
		    rectory).

       PATHSEP	    A colon (semicolon on OS/2), for the user's	convenience.

       PGRP	    The	process	ID of the shell's process group	leader.

       PIPESTATUS   An array containing	the errorlevel	(exit  status)	codes,
		    one	by one,	of the last pipeline run in the	foreground.

       PPID	    The	process	ID of the shell's parent.

       PS1	    The	 primary  prompt  for  interactive shells.  Parameter,
		    command and	arithmetic substitutions  are  performed,  and
		    `!'	 is  replaced with the current command number (see the
		    fc command below).	A literal `!' can be put in the	prompt
		    by placing "!!" in PS1.

		    The	default	prompt is "$ " for non-root  users,  "#	"  for
		    root.  If mksh is invoked by root and PS1 does not contain
		    a  `#'  character,	the default value will be used even if
		    PS1	already	exists in the environment.

		    The	mksh distribution comes	with a sample dot.mkshrc  con-
		    taining  a	sophisticated  example,	but you	might like the
		    following one (note	that ${HOSTNAME:=$(hostname)} and  the
		    root-vs-user  distinguishing  clause are (in this example)
		    executed at	PS1 assignment time, while the $USER and  $PWD
		    are	 escaped and thus will be evaluated each time a	prompt
		    is displayed):

		    PS1='${USER:=$(id -un)}'"@${HOSTNAME:=$(hostname)}:\$PWD $(
			    if (( USER_ID )); then print \$; else print	\#; fi)	"

		    Note that since the	command-line editors try to figure out
		    how	long the prompt	is (so they know how far it is to  the
		    edge  of  the  screen), escape codes in the	prompt tend to
		    mess things	up.  You can tell the shell not	to count  cer-
		    tain  sequences  (such  as escape codes) by	prefixing your
		    prompt with	a character (such as  Ctrl-A)  followed	 by  a
		    carriage  return and then delimiting the escape codes with
		    this character.  Any occurrences of	that character in  the
		    prompt  are	 not  printed.	By the way, don't blame	me for
		    this hack; it's derived from the original ksh88(1),	 which
		    did	 print the delimiter character so you were out of luck
		    if you did not have	any non-printing characters.

		    Since backslashes and other	special	characters may be  in-
		    terpreted by the shell, to set PS1 either escape the back-
		    slash  itself  or  use  double quotes.  The	latter is more
		    practical.	This is	a more complex	example,  avoiding  to
		    directly  enter special characters (for example with ^V in
		    the	emacs editing mode), which embeds the current  working
		    directory,	in  reverse video (colour would	work, too), in
		    the	prompt string:

			  x=$(print \\001) # otherwise unused char
			  PS1="$x$(print \\r)$x$(tput so)$x\$PWD$x$(tput se)$x>	"

		    Due	to a strong suggestion from David G.  Korn,  mksh  now
		    also supports the following	form:

			  PS1=$'\1\r\1\e[7m\1$PWD\1\e[0m\1> '

       PS2	    Secondary  prompt  string, by default "> ",	used when more
		    input is needed to complete	a command.

       PS3	    Prompt used	by the select statement	when  reading  a  menu
		    selection.	The default is "#? ".

       PS4	    Used  to prefix commands that are printed during execution
		    tracing (see the set -x command below).   Parameter,  com-
		    mand  and arithmetic substitutions are performed before it
		    is printed.	 The default is	"+ ".  You may want to set  it
		    to "[$EPOCHREALTIME] " instead, to include timestamps.

       PWD	    The	 current  working directory.  May be unset or empty if
		    the	shell doesn't know where it is.

       RANDOM	    Each time RANDOM is	referenced, it is  assigned  a	number
		    between 0 and 32767	from a Linear Congruential PRNG	first.

       REPLY	    Default  parameter	for  the  read command if no names are
		    given.  Also used in select	loops to store the value  that
		    is read from standard input.

       SECONDS	    The	 number	 of seconds since the shell started or,	if the
		    parameter has been assigned	an integer value,  the	number
		    of	seconds	 since	the assignment plus the	value that was
		    assigned.

       TMOUT	    If set to a	positive integer in an interactive  shell,  it
		    specifies  the  maximum  number  of	seconds	the shell will
		    wait for input after printing the  primary	prompt	(PS1).
		    If the time	is exceeded, the shell exits.

       TMPDIR	    The	 directory  temporary  shell files are created in.  If
		    this parameter is not set or does not contain the absolute
		    path of a writable directory, temporary files are  created
		    in /tmp.

       USER_ID	    The	effective user id of the shell at startup.

   Tilde expansion
       Tilde expansion,	which is done in parallel with parameter substitution,
       is  applied  to	words starting with an unquoted	`~'.  In parameter as-
       signments (such as those	preceding a simple-command or those  occurring
       in the arguments	of a declaration utility), tilde expansion is done af-
       ter  any	 assignment  (i.e. after the equals sign) or after an unquoted
       colon (`:'); login names	are also delimited by colons.  The Korn	shell,
       except in POSIX mode,  always  expands  tildes  after  unquoted	equals
       signs, not just in assignment context (see below), and enables tab com-
       pletion	for tildes after all unquoted colons during command line edit-
       ing.

       The characters following	the tilde, up to the first `/',	 if  any,  are
       assumed	to  be	a login	name.  If the login name is empty, `+' or `-',
       the simplified value of the HOME, PWD or	OLDPWD	parameter  is  substi-
       tuted,  respectively.  Otherwise, the password file is searched for the
       login name, and the tilde expression is	substituted  with  the	user's
       home directory.	If the login name is not found in the password file or
       if  any	quoting	or parameter substitution occurs in the	login name, no
       substitution is performed.

       The home	directory of previously	expanded login names  are  cached  and
       re-used.	  The  alias -d	command	may be used to list, change and	add to
       this cache (e.g.	alias -d fac=/usr/local/facilities; cd ~fac/bin).

   Brace expansion (alternation)
       Brace expressions take the following form:

	     prefix{str1,...,strN}suffix

       The expressions are expanded to N words,	each of	which is the  concate-
       nation  of  prefix,  stri  and suffix (e.g. "a{c,b{X,Y},d}e" expands to
       four words: "ace", "abXe", "abYe" and "ade").  As noted in the example,
       brace expressions can be	nested and the resulting words are not sorted.
       Brace expressions must contain an unquoted comma	(`,') for expansion to
       occur (e.g. {} and {foo}	are not	expanded).  Brace expansion is carried
       out after parameter substitution	and before file	name generation.

   File	name patterns
       A file name pattern is a	word containing	one or more unquoted `?', `*',
       `+', `@'	or `!' characters or "[...]" sequences.	 Once brace  expansion
       has  been  performed,  the  shell  replaces file	name patterns with the
       sorted names of all the files that  match  the  pattern	(if  no	 files
       match, the word is left unchanged).  The	pattern	elements have the fol-
       lowing meaning:

       ?       Matches any single character.

       *       Matches any sequence of octets.

       [...]   Matches	any  of	 the  octets  inside  the brackets.  Ranges of
	       octets can be specified by separating two octets	by a `-' (e.g.
	       "[a0-9]"	matches	the letter `a' or any  digit).	 In  order  to
	       represent  itself,  a `-' must either be	quoted or the first or
	       last octet in the octet list.  Similarly, a `]' must be	quoted
	       or the first octet in the list if it is to represent itself in-
	       stead  of  the  end  of the list.  Also,	a `!' appearing	at the
	       start of	the list has special meaning (see below), so to	repre-
	       sent itself it must be quoted or	appear later in	the list.

       [!...]  Like [...], except it matches any octet not inside  the	brack-
	       ets.

       *(pattern|...|pattern)
	       Matches	any  string of octets that matches zero	or more	occur-
	       rences  of  the	specified  patterns.   Example:	 The   pattern
	       *(foo|bar)  matches  the	strings	"", "foo", "bar", "foobarfoo",
	       etc.

       +(pattern|...|pattern)
	       Matches any string of octets that matches one  or  more	occur-
	       rences	of  the	 specified  patterns.	Example:  The  pattern
	       +(foo|bar) matches the strings "foo", "bar", "foobar", etc.

       ?(pattern|...|pattern)
	       Matches the empty string	or a string that matches  one  of  the
	       specified  patterns.   Example:	The  pattern  ?(foo|bar)  only
	       matches the strings "", "foo" and "bar".

       @(pattern|...|pattern)
	       Matches a string	that matches one of  the  specified  patterns.
	       Example:	 The pattern @(foo|bar)	only matches the strings "foo"
	       and "bar".

       !(pattern|...|pattern)
	       Matches any string that does not	match  one  of	the  specified
	       patterns.  Examples: The	pattern	!(foo|bar) matches all strings
	       except  "foo"  and  "bar"; the pattern !(*) matches no strings;
	       the pattern !(?)* matches all strings (think about it).

       Note that complicated globbing, especially with alternatives, is	 slow;
       using separate comparisons may (or may not) be faster.

       Note  that  mksh	 (and pdksh) never matches "." and "..", but AT&T UNIX
       ksh, Bourne sh and GNU bash do.

       Note that none of the above pattern  elements  match  either  a	period
       (`.')  at  the  start of	a file name or a slash (`/'), even if they are
       explicitly used in a [...] sequence; also, the names "."	and  ".."  are
       never matched, even by the pattern ".*".

       If  the	markdirs  option is set, any directories that result from file
       name generation are marked with a trailing `/'.

   Input/output	redirection
       When a command is executed, its standard	 input,	 standard  output  and
       standard	error (file descriptors	0, 1 and 2, respectively) are normally
       inherited  from	the  shell.   Three exceptions to this are commands in
       pipelines, for which standard input and/or standard  output  are	 those
       set  up by the pipeline,	asynchronous commands created when job control
       is disabled, for	which standard input is	initially  set	to  /dev/null,
       and  commands  for  which  any  of the following	redirections have been
       specified:

       >file	   Standard output is redirected to file.  If  file  does  not
		   exist,  it is created; if it	does exist, is a regular file,
		   and the noclobber option is set, an	error  occurs;	other-
		   wise, the file is truncated.	 Note that this	means the com-
		   mand	cmd <foo >foo will open	foo for	reading	and then trun-
		   cate	 it  when  it  opens it	for writing, before cmd	gets a
		   chance to actually read foo.

       >|file	   Same	as >, except  the  file	 is  truncated,	 even  if  the
		   noclobber option is set.

       >>file	   Same	 as >, except if file exists it	is appended to instead
		   of being truncated.	Also, the file	is  opened  in	append
		   mode,  so  writes  always  go  to  the end of the file (see
		   open(2)).

       <file	   Standard input is redirected	from file, which is opened for
		   reading.

       <>file	   Same	as <, except the file is opened	for reading and	 writ-
		   ing.

       <<marker	   After  reading  the	command	 line  containing this kind of
		   redirection (called a "here document"),  the	 shell	copies
		   lines from the command source into a	temporary file until a
		   line	 matching  marker  is  read.  When the command is exe-
		   cuted, standard input  is  redirected  from	the  temporary
		   file.   If  marker  contains	no quoted characters, the con-
		   tents of the	temporary file are processed as	if enclosed in
		   double quotes each time the command is executed, so parame-
		   ter,	command	and arithmetic	substitutions  are  performed,
		   along  with	backslash  (`\') escapes for `$', ``', `\' and
		   "\newline", but not for `"'.	 If  multiple  here  documents
		   are used on the same	command	line, they are saved in	order.

		   If  no  marker is given, the	here document ends at the next
		   << and substitution will be performed.  If marker is	only a
		   set of either single	"''" or	double `""' quotes with	 noth-
		   ing	in  between,  the here document	ends at	the next empty
		   line	and substitution will not be performed.

       <<-marker   Same	as <<, except leading tabs are stripped	from lines  in
		   the here document.

       <<<word	   Same	as <<, except that word	is the here document.  This is
		   called a here string.

       <&fd	   Standard  input  is duplicated from file descriptor fd.  fd
		   can be a single digit, indicating the number	of an existing
		   file	descriptor; the	letter `p', indicating	the  file  de-
		   scriptor  associated	 with  the  output  of the current co-
		   process; or the character `-', indicating standard input is
		   to be closed.

       >&fd	   Same	as <&, except the operation is done on	standard  out-
		   put.

       &>file	   Same	as >file 2>&1.	This is	a deprecated (legacy) GNU bash
		   extension supported by mksh which also supports the preced-
		   ing	explicit fd digit, for example,	3&>file	is the same as
		   3>file 2>&3 in mksh but a syntax error in GNU bash.

       &>|file,	&>>file, &>&fd
		   Same	as >|file, >>file or >&fd, followed by 2>&1, as	above.
		   These are mksh extensions.

       In any of the above redirections, the file  descriptor  that  is	 redi-
       rected (i.e. standard input or standard output) can be explicitly given
       by  preceding  the redirection with a single digit.  Parameter, command
       and arithmetic substitutions, tilde substitutions, and, if the shell is
       interactive, file name generation are all performed on the file,	marker
       and fd arguments	of redirections.  Note,	however, that the  results  of
       any  file name generation are only used if a single file	is matched; if
       multiple	files match, the word with the expanded	file  name  generation
       characters is used.  Note that in restricted shells, redirections which
       can create files	cannot be used.

       For  simple-commands,  redirections may appear anywhere in the command;
       for compound-commands (if statements, etc.), any	redirections must  ap-
       pear  at	 the end.  Redirections	are processed after pipelines are cre-
       ated and	in the order they are given, so	the following  will  print  an
       error with a line number	prepended to it:

	     $ cat /foo/bar 2>&1 >/dev/null | pr -n -t

       File descriptors	created	by I/O redirections are	private	to the shell.

   Arithmetic expressions
       Integer arithmetic expressions can be used with the let command,	inside
       $((...))	expressions, inside array references (e.g. name[expr]),	as nu-
       meric  arguments	to the test command, and as the	value of an assignment
       to an integer parameter.	 Warning: This also affects  implicit  conver-
       sion  to	 integer,  for	example	as done	by the let command.  Never use
       unchecked user input, e.g. from the environment,	in an arithmetic  con-
       text!

       Expressions  are	 calculated using signed arithmetic and	the mksh_ari_t
       type (a 32-bit signed integer), unless they begin with a	sole `#' char-
       acter, in which case they use mksh_uari_t (a 32-bit unsigned integer).

       Expressions may contain alpha-numeric parameter identifiers, array ref-
       erences and integer constants and may be	combined with the following  C
       operators (listed and grouped in	increasing order of precedence):

       Unary operators:

	     + - ! ~ ++	--

       Binary operators:

	     ,
	     = += -= *=	/= %= <<= >>= ^<= ^>= &= ^= |=
	     ||
	     &&
	     |
	     ^
	     &
	     ==	!=
	     < <= > >=
	     <<	>> ^< ^>
	     + -
	     * / %

       Ternary operators:

	     ?:	(precedence is immediately higher than assignment)

       Grouping	operators:

	     ( )

       Integer	constants  and	expressions  are  calculated  using an exactly
       32-bit wide, signed or unsigned,	type with silent wraparound on integer
       overflow.  Integer constants may	be specified with arbitrary bases  us-
       ing  the	notation base#number, where base is a decimal integer specify-
       ing the base (up	to 36),	and number is a	number in the specified	 base.
       Additionally,  base-16 integers may be specified	by prefixing them with
       "0x" (case-insensitive) in all forms of arithmetic expressions,	except
       as  numeric  arguments to the test built-in utility.  Prefixing numbers
       with a sole digit zero ("0") does not  cause  interpretation  as	 octal
       (except	in  POSIX mode,	as required by the standard), as that's	unsafe
       to do.

       As a special mksh extension, numbers to the base	of one are treated  as
       either (8-bit transparent) ASCII	or Universal Coded Character Set code-
       points, depending on the	shell's	utf8-mode flag (current	setting).  The
       AT&T  UNIX  ksh93  syntax  of "'x'" instead of "1#x" is also supported.
       Note that NUL bytes (integral value of zero) cannot be used.  An	 unset
       or  empty  parameter  evaluates	to 0 in	integer	context.  If `x' isn't
       comprised of exactly one	valid character, the  behaviour	 is  undefined
       (usually, the shell aborts with a parse error, but rarely, it succeeds,
       e.g.  on	the sequence C2	20); users of this feature (as opposed to read
       -a) must	validate the input first.  See "CAVEATS" for UTF-8  mode  han-
       dling.

       The operators are evaluated as follows:

	     unary +
		     Result is the argument (included for completeness).

	     unary -
		     Negation.

	     !	     Logical  NOT;  the	 result	is 1 if	argument is zero, 0 if
		     not.

	     ~	     Arithmetic	(bit-wise) NOT.

	     ++	     Increment;	must be	applied	to a parameter (not a  literal
		     or	other expression).  The	parameter is incremented by 1.
		     When  used	as a prefix operator, the result is the	incre-
		     mented value of the parameter; when used as a postfix op-
		     erator, the result	is the original	value of  the  parame-
		     ter.

	     --	     Similar to	++, except the parameter is decremented	by 1.

	     ,	     Separates	two arithmetic expressions; the	left-hand side
		     is	evaluated first, then the right.  The  result  is  the
		     value of the expression on	the right-hand side.

	     =	     Assignment;  the variable on the left is set to the value
		     on	the right.

	     +=	-= *= /= %= <<=	>>= ^<=	^>= &= ^= |=
		     Assignment	operators.  <var><op>=<expr> is	 the  same  as
		     <var>=<var><op><expr>,  with  any	operator precedence in
		     <expr> preserved.	For example, "var1 *= 5	+  3"  is  the
		     same as specifying	"var1 =	var1 * (5 + 3)".

	     ||	     Logical  OR;  the	result is 1 if either argument is non-
		     zero, 0 if	not.  The right	argument is evaluated only  if
		     the left argument is zero.

	     &&	     Logical  AND;  the	result is 1 if both arguments are non-
		     zero, 0 if	not.  The right	argument is evaluated only  if
		     the left argument is non-zero.

	     |	     Arithmetic	(bit-wise) OR.

	     ^	     Arithmetic	(bit-wise) XOR (exclusive-OR).

	     &	     Arithmetic	(bit-wise) AND.

	     ==	     Equal;  the result	is 1 if	both arguments are equal, 0 if
		     not.

	     !=	     Not equal;	the result is 0	if both	arguments are equal, 1
		     if	not.

	     <	     Less than;	the result is 1	if the left argument  is  less
		     than the right, 0 if not.

	     <=	> >=
		     Less  than	or equal, greater than,	greater	than or	equal.
		     See <.

	     <<	>>   Shift left	(right); the result is the left	argument  with
		     its  bits	arithmetically (signed operation) or logically
		     (unsigned expression) shifted left	(right)	by the	amount
		     given in the right	argument.

	     ^<	^>   Rotate  left (right); the result is similar to shift, ex-
		     cept that the bits	shifted	out at one end are shifted  in
		     at	the other end, instead of zero or sign bits.

	     + - * /
		     Addition, subtraction, multiplication and division.

	     %	     Remainder;	 the  result is	the symmetric remainder	of the
		     division of the left argument by the right.  To  get  the
		     mathematical  modulus of "a mod b", use the formula "(a %
		     b + b) % b".

	     <arg1>?<arg2>:<arg3>
		     If	<arg1> is non-zero, the	result	is  <arg2>;  otherwise
		     the  result  is  <arg3>.	The non-result argument	is not
		     evaluated.

   Co-processes
       A co-process (which is a	pipeline created with the "|&" operator) is an
       asynchronous process that the shell can both write to (using print  -p)
       and  read from (using read -p).	The input and output of	the co-process
       can also	be manipulated using >&p and <&p  redirections,	 respectively.
       Once  a co-process has been started, another can't be started until the
       co-process exits, or until the co-process's input has  been  redirected
       using  an exec n>&p redirection.	 If a co-process's input is redirected
       in this way, the	next co-process	to be started will  share  the	output
       with  the first co-process, unless the output of	the initial co-process
       has been	redirected using an exec n<&p redirection.

       Some notes concerning co-processes:

          The only way	to close the co-process's  input  (so  the  co-process
	   reads  an  end-of-file) is to redirect the input to a numbered file
	   descriptor and then close that file	descriptor:  exec  3>&p;  exec
	   3>&-

          In  order for co-processes to share a common	output,	the shell must
	   keep	the write portion of the output	pipe open.   This  means  that
	   end-of-file will not	be detected until all co-processes sharing the
	   co-process's	 output	 have  exited  (when  they all exit, the shell
	   closes its copy of the pipe).  This can be avoided  by  redirecting
	   the	output	to a numbered file descriptor (as this also causes the
	   shell to close its copy).  Note that	 this  behaviour  is  slightly
	   different from the original Korn shell which	closes its copy	of the
	   write  portion  of  the  co-process	output	when the most recently
	   started co-process (instead of when all sharing  co-processes)  ex-
	   its.

          print -p will ignore	SIGPIPE	signals	during writes if the signal is
	   not	being  trapped	or ignored; the	same is	true if	the co-process
	   input has been duplicated to	another	file descriptor	and print  -un
	   is used.

   Functions
       Functions  are  defined	using either Korn shell	function function-name
       syntax or the Bourne/POSIX shell	function-name()	syntax (see below  for
       the  difference	between	 the two forms).  Functions are	like .-scripts
       (i.e. scripts sourced using the "." built-in) in	that they are executed
       in the current environment.  However, unlike .-scripts, shell arguments
       (i.e. positional	parameters $1, $2,  etc.)  are	never  visible	inside
       them.   When  the shell is determining the location of a	command, func-
       tions are searched after	special	built-in commands, before builtins and
       the PATH	is searched.

       An existing function may	be deleted using unset	-f  function-name.   A
       list of functions can be	obtained using typeset +f and the function de-
       finitions  can be listed	using typeset -f.  The autoload	command	(which
       is an alias for typeset -fu) may	be used	to create undefined functions:
       when an undefined function is executed, the  shell  searches  the  path
       specified  in  the FPATH	parameter for a	file with the same name	as the
       function	which, if found, is read and executed.	If after executing the
       file the	named function is found	to be defined, the  function  is  exe-
       cuted;  otherwise,  the	normal	command	 search	is continued (i.e. the
       shell searches the regular built-in command table and PATH).  Note that
       if a command is not found using PATH, an	attempt	is made	to autoload  a
       function	 using	FPATH (this is an undocumented feature of the original
       Korn shell).

       Functions can have two attributes, "trace" and "export",	which  can  be
       set  with  typeset  -ft	and  typeset -fx, respectively.	 When a	traced
       function	is executed, the shell's xtrace	option is turned  on  for  the
       function's  duration.  The "export" attribute of	functions is currently
       not used.

       Since functions are executed in the current shell environment,  parame-
       ter  assignments	 made  inside functions	are visible after the function
       completes.  If this is not the desired effect, the typeset command  can
       be  used	inside a function to create a local parameter.	Note that AT&T
       UNIX ksh93 uses static scoping (one global scope, one local  scope  per
       function)  and  allows  local  variables	 only on Korn style functions,
       whereas mksh uses dynamic scoping (nested scopes	of varying  locality).
       Note that special parameters (e.g. $$, $!) can't	be scoped in this way.

       The  exit  status of a function is that of the last command executed in
       the function.  A	function can be	made to	finish immediately  using  the
       return  command;	 this  may also	be used	to explicitly specify the exit
       status.	Note that when called in a subshell,  return  will  only  exit
       that  subshell  and will	not cause the original shell to	exit a running
       function	(see the while...read loop FAQ).

       Functions defined with the function reserved word are  treated  differ-
       ently  in  the  following ways from functions defined with the () nota-
       tion:

          The $0 parameter is set to the name of the  function	 (Bourne-style
	   functions leave $0 untouched).

          OPTIND is saved/reset and restored on entry and exit	from the func-
	   tion	 so  getopts  can be used properly both	inside and outside the
	   function (Bourne-style functions leave OPTIND untouched,  so	 using
	   getopts inside a function interferes	with using getopts outside the
	   function).

          Shell  options  (set	 -o)  have  local scope, i.e. changes inside a
	   function are	reset upon its exit.

       In the future, the following differences	may also be added:

          A separate trap/signal environment will be used during  the	execu-
	   tion	of functions.  This will mean that traps set inside a function
	   will	 not affect the	shell's	traps and signals that are not ignored
	   in the shell	(but may be trapped) will have their default effect in
	   a function.

          The EXIT trap, if set in a function,	will  be  executed  after  the
	   function returns.

   Command execution
       After  evaluation of command-line arguments, redirections and parameter
       assignments, the	type of	command	is determined: a special built-in com-
       mand, a function, a normal builtin or the name of  a  file  to  execute
       found  using  the PATH parameter.  The checks are made in the above or-
       der.  Special built-in commands differ from other commands in that  the
       PATH  parameter	is not used to find them, an error during their	execu-
       tion can	cause a	non-interactive	shell to exit, and  parameter  assign-
       ments  that are specified before	the command are	kept after the command
       completes.  Regular built-in commands are different only	 in  that  the
       PATH parameter is not used to find them.

       POSIX special built-in utilities:

       ., :, break, continue, eval, exec, exit,	export,	readonly, return, set,
       shift, times, trap, unset

       Additional mksh commands	keeping	assignments:

       source, typeset

       All other builtins are not special; these are at	least:

       [,  alias,  bg,	bind,  builtin,	cat, cd, command, echo,	false, fc, fg,
       getopts,	jobs, kill, let, print,	pwd, read,  realpath,  rename,	sleep,
       suspend,	test, true, ulimit, umask, unalias, wait, whence

       Once  the type of command has been determined, any command-line parame-
       ter assignments are performed and exported for the duration of the com-
       mand.

       The following describes the special and regular built-in	 commands  and
       builtin-like reserved words, as well as some optional utilities:

       . file [arg ...]
	      (keeps  assignments,  special) This is called the	"dot" command.
	      Execute the commands in file in the  current  environment.   The
	      file  is	searched for in	the directories	of PATH.  If arguments
	      are given, the positional	parameters may be used to access  them
	      while  file  is  being executed.	If no arguments	are given, the
	      positional parameters are	those of the environment  the  command
	      is used in.

       : [...]
	      (keeps assignments, special) The null command.
	      Exit status is set to zero.

       Lb64decode [string]
	      (dot.mkshrc function) Decode string or standard input to binary.

       Lb64encode [string]
	      (dot.mkshrc function) Encode string or standard input as base64.

       Lbafh_init
       Lbafh_add [string]
       Lbafh_finish
	      (dot.mkshrc  functions)  Implement  the  Better Avalance for the
	      Jenkins Hash.  This is the same hash mksh	currently uses	inter-
	      nally.   After calling Lbafh_init, call Lbafh_add	multiple times
	      until all	input is read, then call  Lbafh_finish,	 which	writes
	      the  result  to  the  unsigned integer Lbafh_v variable for your
	      consumption.

       Lstripcom [file ...]
	      (dot.mkshrc function) Same as cat	but strips any empty lines and
	      comments (from any `#' character onwards,	no  escapes)  and  re-
	      duces any	amount of whitespace to	one space character.

       [ expression ]
	      (regular)	See test.

       alias [-d | -t [-r] | -+x] [-p] [+] [name [=value] ...]
	      (regular)	 Without  arguments, alias lists all aliases.  For any
	      name without a value, the	existing alias is  listed.   Any  name
	      with   a	 value	 defines   an	alias;	see  "Aliases"	above.
	      [][A-Za-z0-9_!%+,.@:-] are valid in names, except	they  may  not
	      begin  with  a plus or hyphen-minus, and [[ is not a valid alias
	      name.

	      When listing aliases, one	of two	formats	 is  used.   Normally,
	      aliases  are listed as name=value, where value is	quoted as nec-
	      essary.  If options were preceded	with `+', or  a	 lone  `+'  is
	      given on the command line, only name is printed.

	      The  -d  option causes directory aliases which are used in tilde
	      expansion	to be listed or	set (see "Tilde	expansion" above).

	      With -p, each alias is listed with the string "alias " prefixed.

	      The  -t  option  indicates  that	tracked	 aliases  are  to   be
	      listed/set  (values  given  with	the  command  are  ignored for
	      tracked aliases).

	      The -r option indicates that all tracked aliases are to  be  re-
	      set.

	      The -x option sets (+x clears) the export	attribute of an	alias,
	      or, if no	names are given, lists the aliases with	the export at-
	      tribute (exporting an alias has no effect).

       autoload
	      (built-in	alias) See "Functions" above.

       bg [job ...]
	      (regular,	needs job control) Resume the specified	stopped	job(s)
	      in  the  background.   If	 no jobs are specified,	%+ is assumed.
	      See "Job control"	below for more information.

       bind -l
	      (regular)	The names of editing commands strings can be bound  to
	      are listed.  See "Emacs editing mode" for	more information.

       bind [string ...]
	      The  current  bindings,  for  string,  if	 given,	 else all, are
	      listed.  Note: Default prefix bindings (1=Esc, 2=^X, 3=NUL)  as-
	      sumed.

       bind string=[editing-command] [...]
       bind -m string=substitute [...]
	      To  string,  which should	consist	of a control character option-
	      ally preceded by one of the three	prefix characters and  option-
	      ally  succeeded  by  a  tilde  character,	the editing-command is
	      bound so that future input of the	string will immediately	invoke
	      that editing command.  If	a tilde	 postfix  is  given,  a	 tilde
	      trailing	the  control  character	 is ignored.  If -m (macro) is
	      given, future input of the string	will be	replaced by the	 given
	      NUL-terminated  substitute  string, wherein prefix/control/tilde
	      characters mapped	to editing commands (but not those  mapped  to
	      other macros) will be processed.

	      Prefix  and  control characters may be written using caret nota-
	      tion, i.e. ^Z represents Ctrl-Z.	Use a backslash	to escape  the
	      caret, an	equals sign or another backslash.  Note	that, although
	      only  three prefix characters (usually Esc, ^X and NUL) are sup-
	      ported, some multi-character sequences can be supported.

       break [level]
	      (keeps assignments, special) Exit	the  levelth  inner-most  for,
	      select, until or while loop.  level defaults to 1.

       builtin [--] command [arg ...]
	      (regular)	Execute	the built-in command command.

       \builtin	command	[arg ...]
	      (regular,	decl-forwarder)	Same as	builtin.  Additionally acts as
	      declaration  utility forwarder, i.e. this	is a declaration util-
	      ity (see "Tilde expansion") iff command is a  declaration	 util-
	      ity.

       cat [-u]	[file ...]
	      (defer  with flags) Copy files in	command	line order to standard
	      output.  If a file is a single dash ("-")	or absent,  read  from
	      standard	input.	 For direct builtin calls, the POSIX -u	option
	      is supported as a	no-op.	For calls from shell, if  any  options
	      are  given,  an  external	 cat(1)	 utility is preferred over the
	      builtin.

       cd [-L] [dir]
       cd -P [-e] [dir]
       chdir [-eLP] [dir]
	      (regular)	Set the	working	directory to dir.   If	the  parameter
	      CDPATH  is  set, it lists	the search path	for the	directory con-
	      taining dir.  An unset or	empty path means  the  current	direc-
	      tory.   If  dir  is  found in any	component of the CDPATH	search
	      path other than an unset or empty	path,  the  name  of  the  new
	      working directory	will be	written	to standard output.  If	dir is
	      missing,	the  home  directory HOME is used.  If dir is "-", the
	      previous working directory is used (see the OLDPWD parameter).

	      If the -L	option (logical	path) is used or if the	 physical  op-
	      tion  isn't  set (see the	set command below), references to ".."
	      in dir are relative to the path used to get  to  the  directory.
	      If  the -P option	(physical path)	is used	or if the physical op-
	      tion is set, ".."	is relative to the filesystem directory	 tree.
	      The PWD and OLDPWD parameters are	updated	to reflect the current
	      and  old	working	 directory, respectively.  If the -e option is
	      set for physical filesystem traversal and	PWD could not be  set,
	      the  exit	code is	1; greater than	1 if an	error occurred,	0 oth-
	      erwise.

       cd [-eLP] old new
       chdir [-eLP] old	new
	      (regular)	The string new is substituted for old in  the  current
	      directory,  and  the  shell attempts to change to	the new	direc-
	      tory.

       cls    (dot.mkshrc alias) Reinitialise the display (hard	reset).

       command [-pVv] cmd [arg ...]
	      (regular,	decl-forwarder)	If neither the -v  nor	-V  option  is
	      given, cmd is executed exactly as	if command had not been	speci-
	      fied,  with two exceptions: firstly, cmd cannot be a shell func-
	      tion; and	secondly, special built-in commands  lose  their  spe-
	      cialness	(i.e.  redirection and utility errors do not cause the
	      shell to exit, and command assignments are not permanent).

	      If the -p	option is given, a default search path,	 whose	actual
	      value is system-dependent, is used instead of the	current	PATH.

	      If the -v	option is given, instead of executing cmd, information
	      about  what  would  be executed is given for each	argument.  For
	      builtins,	 functions  and	 keywords,  their  names  are	simply
	      printed;	for  aliases,  a command that defines them is printed;
	      for utilities found by searching the PATH	 parameter,  the  full
	      path  of	the  command is	printed.  If no	command	is found (i.e.
	      the path search fails), nothing is  printed  and	command	 exits
	      with  a  non-zero	 status.  The -V option	is like	the -v option,
	      but more verbose.

       continue	[level]
	      (keeps assignments, special)  Jumps  to  the  beginning  of  the
	      levelth  inner-most for, select, until or	while loop.  level de-
	      faults to	1.

       dirs [-lnv]
	      (dot.mkshrc function) Print  the	directory  stack.   -l	causes
	      tilde expansion to occur in the output.  -n causes line wrapping
	      before 80	columns, whereas -v causes numbered vertical output.

       doch   (dot.mkshrc alias) Execute the last command with sudo(8).

       echo [-Een] [arg	...]
	      (regular)	 Warning:  this	utility	is not portable; use the stan-
	      dard Korn	shell built-in utility print in	new code instead.

	      Print arguments, separated by spaces, followed by	a newline,  to
	      standard	output.	 The newline is	suppressed if any of the argu-
	      ments contain the	backslash sequence "\c".  See the  print  com-
	      mand  below  for	a  list	 of other backslash sequences that are
	      recognised.

	      The options  are	provided  for  compatibility  with  BSD	 shell
	      scripts.	 The -E	option suppresses backslash interpretation, -e
	      enables it (normally default), -n	suppresses the	trailing  new-
	      line,  and  anything else	causes the word	to be printed as argu-
	      ment instead.

	      If the posix or sh option	is set or this	is  a  direct  builtin
	      call  or	print -R, only the first argument is treated as	an op-
	      tion, and	only if	it is exactly "-n".  Backslash	interpretation
	      is disabled.

       enable [-anps] [name ...]
	      (dot.mkshrc   function)  Hide  and  unhide  built-in  utilities,
	      aliases and functions and	those defined in dot.mkshrc.

	      If no name is given or the  -p  option  is  used,	 builtins  are
	      printed  (behind	the string "enable ", followed by "-n "	if the
	      builtin is currently disabled), otherwise, they are disabled (if
	      -n is given) or re-enabled.

	      When printing, only enabled builtins are printed by default; the
	      -a options prints	all builtins, while -n	prints	only  disabled
	      builtins instead;	-s limits the list to POSIX special builtins.

       eval command ...
	      (keeps  assignments,  special)  The  arguments are concatenated,
	      with a space between each, to form a  single  string  which  the
	      shell then parses	and executes in	the current execution environ-
	      ment.

       exec [-a	argv0] [-c] [command [arg ...]]
	      (keeps assignments, special) The command (with arguments)	is ex-
	      ecuted  without forking, fully replacing the shell process; this
	      is absolute, i.e.	exec never returns, even if the	command	is not
	      found.  The -a option permits setting a different	argv[0]	value,
	      and  -c  clears  the  environment	 before	 executing  the	 child
	      process, except for the _	parameter and direct assignments.

	      If no command is given except for	I/O redirection, the I/O redi-
	      rection  is  permanent  and the shell is not replaced.  Any file
	      descriptors greater than 2 which are opened or dup(2)'d in  this
	      way are not made available to other executed commands (i.e. com-
	      mands that are not built-in to the shell).  Note that the	Bourne
	      shell differs here; it does pass these file descriptors on.

       exit [status]
	      (keeps  assignments,  special)  The shell	or subshell exits with
	      the specified errorlevel (or the current value of	the $? parame-
	      ter).

       export [-p] [parameter[=value]]
	      (keeps assignments, special,  decl-util)	Sets  the  export  at-
	      tribute of the named parameters.	Exported parameters are	passed
	      in  the  environment to executed commands.  If values are	speci-
	      fied, the	named parameters are also assigned.  This is a	decla-
	      ration utility.

	      If  no  parameters are specified,	all parameters with the	export
	      attribute	set are	printed	one per	line: either their names,  or,
	      if  a  "-" with no option	letter is specified, name=value	pairs,
	      or, with the -p option, export commands suitable for re-entry.

       extproc
	      (OS/2) Null command required for shebang-like functionality.

       false  (regular)	A command that exits with a non-zero status.

       fc [-e editor | -l [-n]]	[-r] [first [last]]
	      (regular)	first and last select commands from the	history.  Com-
	      mands can	be selected by history	number	(negative  numbers  go
	      backwards	from the current, most recent, line) or	a string spec-
	      ifying  the  most	recent command starting	with that string.  The
	      -l option	lists the command on standard output, and -n  inhibits
	      the  default  command numbers.  The -r option reverses the order
	      of the list.  Without -l,	the selected commands  are  edited  by
	      the  editor  specified with the -e option	or, if no -e is	speci-
	      fied, the	editor specified by the	FCEDIT parameter (if this  pa-
	      rameter is not set, /bin/ed is used), and	the result is executed
	      by the shell.

       fc -e - | -s [-g] [old=new] [prefix]
	      (regular)	 Re-execute the	selected command (the previous command
	      by default) after	performing the optional	 substitution  of  old
	      with  new.   If  -g is specified,	all occurrences	of old are re-
	      placed with new.	The meaning of -e - and	-s is  identical:  re-
	      execute  the  selected command without invoking an editor.  This
	      command is usually accessed with the predefined: alias r='fc  -e
	      -'

       fg [job ...]
	      (regular,	 needs job control) Resume the specified job(s)	in the
	      foreground.  If no jobs are specified, %+	is assumed.
	      See "Job control"	below for more information.

       functions [name ...]
	      (built-in	alias) Display the function definition commands	corre-
	      sponding to the listed, or all defined, functions.

       getopts optstring name [arg ...]
	      (regular)	Used by	shell procedures to parse the specified	 argu-
	      ments  (or positional parameters,	if no arguments	are given) and
	      to check for legal options.  Options that	do not take  arguments
	      may  be grouped in a single argument.  If	an option takes	an ar-
	      gument and the option character is not the last character	of the
	      word it is found in, the remainder of the	word is	 taken	to  be
	      the  option's argument; otherwise, the next word is the option's
	      argument.

	      optstring	contains the option letters to be  recognised.	 If  a
	      letter is	followed by a colon, the option	takes an argument.

	      Each  time  getopts is invoked, it places	the next option	in the
	      shell parameter name.  If	the option was introduced with a  `+',
	      the character placed in name is prefixed with a `+'.  If the op-
	      tion  takes  an  argument,  it  is placed	in the shell parameter
	      OPTARG.

	      When an illegal option or	a missing option argument  is  encoun-
	      tered,  a	question mark or a colon is placed in name (indicating
	      an illegal option	or missing argument, respectively) and	OPTARG
	      is  set  to the option letter that caused	the problem.  Further-
	      more, unless optstring begins with a colon, a question  mark  is
	      placed  in  name,	 OPTARG	 is unset and a	diagnostic is shown on
	      standard error.

	      getopts records the index	of the argument	to be processed	by the
	      next call	in OPTIND.  When the end of  the  options  is  encoun-
	      tered,  getopts  returns a non-zero exit status.	Options	end at
	      the first	argument that does not start with  a  `-'  (non-option
	      argument)	or when	a "--" argument	is encountered.

	      Option parsing can be reset by setting OPTIND to 1 (this is done
	      automatically  whenever  the  shell  or a	shell procedure	is in-
	      voked).

	      Warning: Changing	the value of the shell parameter OPTIND	 to  a
	      value  other than	1 or parsing different sets of arguments with-
	      out resetting OPTIND may lead to unexpected results.

       hash [-r] [name ...]
	      (built-in	alias) Without arguments, any hashed  executable  com-
	      mand paths are listed.  The -r option causes all hashed commands
	      to  be  removed  from the	cache.	Each name is searched as if it
	      were a command name and added to the cache  if  it  is  an  exe-
	      cutable command.

       hd [file	...]
	      (dot.mkshrc  alias or function) Hexdump stdin or arguments legi-
	      bly.

       history [-nr] [first [last]]
	      (built-in	alias) Same as fc -l (see above).

       integer [flags] [name [=value] ...]
	      (built-in	alias) Same as typeset -i (see below).

       jobs [-lnp] [job	...]
	      (regular)	Display	information about the specified	job(s);	if  no
	      jobs  are	 specified,  all  jobs	are  displayed.	 The -n	option
	      causes information to be	displayed  only	 for  jobs  that  have
	      changed  state since the last notification.  If the -l option is
	      used, the	process	ID of each process in a	job  is	 also  listed.
	      The  -p  option  causes only the process group of	each job to be
	      printed.	See "Job control" below	for the	format of job and  the
	      displayed	job.

       kill [-s	signame	| -signum | -signame] {	job | pid | pgrp } ...
	      (regular)	 Send  the  specified  signal  to  the specified jobs,
	      process IDs or process groups.  If no signal is  specified,  the
	      TERM  signal is sent.  If	a job is specified, the	signal is sent
	      to the job's process group.  See "Job  control"  below  for  the
	      format of	job.

       kill -l [exit-status ...]
	      (regular)	 Print	the  signal name corresponding to exit-status.
	      If no arguments are specified, a list of all  the	 signals  with
	      their numbers and	a short	description of each are	printed.

       let [expression ...]
	      (regular)	  Each	 expression   is  evaluated  (see  "Arithmetic
	      expressions" above).  If all expressions evaluate	 successfully,
	      the  exit	 status	 is  0 (1) if the last expression evaluated to
	      non-zero (zero).	If an error occurs during the parsing or eval-
	      uation of	an expression, the exit	 status	 is  greater  than  1.
	      Since expressions	may need to be quoted, (( expr )) is syntactic
	      sugar for:
		    { \\builtin	let 'expr'; }

       local [flags] [name [=value] ...]
	      (built-in	alias) Same as typeset (see below).

       mknod [-m mode] name b|c	major minor
       mknod [-m mode] name p
	      (optional)  Create  a device special file.  The file type	may be
	      one of b (block type device), c (character  type	device)	 or  p
	      (named  pipe, FIFO).  The	file created may be modified according
	      to its mode (via the -m option), major  (major  device  number),
	      and  minor  (minor device	number).  This is not normally part of
	      mksh; however, distributors may have added this as builtin as  a
	      speed hack.

       nameref [flags] [name [=value] ...]
	      (built-in	alias) Same as typeset -n (see below).

       popd [-lnv] [+n]
	      (dot.mkshrc  function)  Pops  the	directory stack	and returns to
	      the new top directory.  The flags	are as in dirs (see above).  A
	      numeric argument +n selects the entry in the stack to discard.

       print [-AcelNnprsu[n] | -R [-n]]	[argument ...]
	      (regular)	Print the specified argument(s)	on the	standard  out-
	      put,  separated  by  spaces, terminated with a newline.  The es-
	      capes mentioned in "Backslash expansion" above, as well as "\c",
	      which is equivalent to using the -n option, are interpreted.

	      The options are as follows:

	      -A     Each argument is arithmetically evaluated;	the  character
		     corresponding  to	the resulting value is printed.	 Empty
		     arguments separate	input words.

	      -c     The output	is printed columnised, line by	line,  similar
		     to	 how  the  rs(1)  utility, tab completion, the kill -l
		     built-in utility and the select statement do.

	      -e     Restore backslash expansion after a previous -r.

	      -l     Change the	output word separator to newline.

	      -N     Change the	output word and	line separator to ASCII	NUL.

	      -n     Do	not print the trailing line separator.

	      -p     Print to the co-process (see "Co-processes" above).

	      -r     Inhibit backslash expansion.

	      -s     Print to the history file instead of standard output.

	      -u[n]  Print to the file descriptor n (defaults to 1 if omitted)
		     instead of	standard output.

	      The -R option mostly emulates the	BSD echo(1) command which does
	      not expand backslashes and interprets its	first argument as  op-
	      tion  only  if  it  is  exactly  "-n"  (to suppress the trailing
	      newline).

       printf format [arguments	...]
	      (optional, defer always) If compiled in, format  and  print  the
	      arguments,  supporting  the  bare	POSIX-mandated minimum.	 If an
	      external utility of the same name	is found, it is	 deferred  to,
	      unless run as direct builtin call	or from	the builtin utility.

       pushd [-lnv]
	      (dot.mkshrc  function) Rotate the	top two	elements of the	direc-
	      tory stack.  The options are the same as for dirs	 (see  above),
	      and  pushd  changes  to  the topmost directory stack entry after
	      acting.

       pushd [-lnv] +n
	      (dot.mkshrc function) Rotate the element number n	to the top.

       pushd [-lnv] name
	      (dot.mkshrc function) Push name on top of	the stack.

       pwd [-LP]
	      (regular)	Print the present working directory.   If  no  options
	      are given, pwd behaves as	if the -P option (print	physical path)
	      was  used	 if  the  physical  shell option is set, the -L	option
	      (print logical path) otherwise.  The logical path	 is  the  path
	      used to cd to the	current	directory; the physical	path is	deter-
	      mined  from the filesystem (by following ".." directories	to the
	      root directory).

       r [-g] [old=new]	[prefix]
	      (built-in	alias) Same as fc -e - (see above).

       read [-A	| -a] [-d x] [-N z | -n	z] [-p | -u[n]]	[-t n] [-rs] [p	...]
	      (regular)	Reads a	line of	input, separates the input into	fields
	      using the	IFS parameter  (see  "Substitution"  above)  or	 other
	      specified	means, and assigns each	field to the specified parame-
	      ters  p.	If no parameters are specified,	the REPLY parameter is
	      used to store the	result.	 If there  are	more  parameters  than
	      fields,  the  extra parameters are set to	the empty string or 0;
	      if there are more	fields than parameters,	the last parameter  is
	      assigned the remaining fields (including the word	separators).

	      The options are as follows:

	      -A     Store the result into the parameter p (or REPLY) as array
		     of	words.	Only no	or one parameter is accepted.

	      -a     Store  the	 result,  without applying IFS word splitting,
		     into the parameter	p (or REPLY) as	 array	of  characters
		     (wide  characters	if  the	 utf8-mode  option is enacted,
		     octets otherwise);	the codepoints are encoded as  decimal
		     numbers  by  default.   Only  no  or one parameter	is ac-
		     cepted.

	      -d x   Use the first byte	of x, NUL if  empty,  instead  of  the
		     ASCII newline character to	delimit	input lines.

	      -N z   Instead  of  reading  till	 end-of-line,  read  exactly z
		     bytes.  Upon EOF, a partial read is  returned  with  exit
		     status 1.	After timeout, a partial read is returned with
		     an	exit status as if SIGALRM were caught.

	      -n z   Instead  of  reading till end-of-line, read up to z bytes
		     but return	as soon	as any bytes are  read,	 e.g.  from  a
		     slow terminal device, or if EOF or	a timeout occurs.

	      -p     Read   from   the	 currently   active   co-process  (see
		     "Co-processes" above for details) instead of from a  file
		     descriptor.

	      -u[n]  Read  from	 the  file descriptor number n (defaults to 0,
		     i.e. standard input).
		     The argument must immediately follow the  option  charac-
		     ter.

	      -t n   Interrupt	reading	after n	seconds	(specified as positive
		     decimal value with	an  optional  fractional  part).   The
		     exit status of read is the	same as	if SIGALRM were	caught
		     if	 the  timeout occurred,	but partial reads may still be
		     returned.

	      -r     Normally, read strips backslash-newline sequences and any
		     remaining backslashes from	input.	 This  option  enables
		     raw mode, in which	backslashes are	retained and ignored.

	      -s     The input line is saved to	the history.

	      If  the  input  is a terminal, both the -N and -n	options	set it
	      into raw mode; they read an entire file if -1 is passed as z ar-
	      gument.

	      The first	parameter may have a question mark and	a  string  ap-
	      pended  to  it,  in  which  case	the string is used as a	prompt
	      (printed to standard error before	any input is read) if the  in-
	      put is a tty(4) (e.g. read nfoo?'number of foos: ').

	      If  no  input  is	 read or a timeout occurred, read exits	with a
	      non-zero status.

       readonly	[-p] [parameter	[=value] ...]
	      (keeps assignments, special, decl-util) Sets the	read-only  at-
	      tribute  of  the named parameters.  If values are	given, parame-
	      ters are assigned	these before disallowing writes.  Once a para-
	      meter is made read-only, it cannot be unset and its value	cannot
	      be changed.

	      If no parameters are specified, the names	of all parameters with
	      the read-only attribute are printed one per line,	unless the  -p
	      option  is  used,	 in  which case	readonly commands defining all
	      read-only	parameters, including their values, are	printed.

       realpath	[--] name
	      (defer with flags) Resolves an absolute  pathname	 corresponding
	      to  name.	 If the	resolved pathname either exists	or can be cre-
	      ated immediately,	realpath returns 0  and	 prints	 the  resolved
	      pathname,	 otherwise or if an error occurs, it issues a diagnos-
	      tic and returns nonzero.	If name	ends with a slash  (`/'),  re-
	      solving to an extant non-directory is also treated as error.

       rename [--] from	to
	      (defer  always)  Renames the file	from to	to.  Both must be com-
	      plete pathnames and on the same device.  Intended	for  emergency
	      situations  (where  /bin/mv  becomes  unusable);	directly calls
	      rename(2).

       return [status]
	      (keeps assignments, special) Returns from	a function or .	script
	      with errorlevel status.  If no status is given, the exit	status
	      of  the  last  executed  command	is used.  If used outside of a
	      function or . script, it has the same effect as exit.  Note that
	      mksh treats both profile and ENV files as	. scripts,  while  the
	      original Korn shell only treated profiles	as . scripts.

       rot13  (dot.mkshrc alias) ROT13-encrypts/-decrypts stdin	to stdout.

       set [-+abCefhiklmnprsUuvXx] [-+o	option]	[-+A name] [--]	[arg ...]
	      (keeps assignments, special) The set command can be used to show
	      all  shell  parameters  (like  typeset  -), set (-) or clear (+)
	      shell options, set an array parameter or the positional  parame-
	      ters.

	      Options can be changed using the -+o option syntax, where	option
	      is  the  long  name  of an option, or using the -+letter syntax,
	      where letter is the option's single letter name (not all options
	      have a single letter name).  The following table lists short (if
	      extant) and long names along with	a description of what each op-
	      tion does:

	      -A name
		   Sets	the elements of	the array parameter name to arg	...

		   If -A is used, the array is reset (i.e. emptied) first;  if
		   +A  is  used,  the first N elements are set (where N	is the
		   number of arguments); the rest are left untouched.  If name
		   ends	with a `+', the	array is appended to instead.

		   An alternative syntax for the command set -A	foo -- a b  c;
		   set -A foo+ -- d e which is compatible to GNU bash and also
		   supported by	AT&T UNIX ksh93	is: foo=(a b c); foo+=(d e)

	      -a | -o allexport
		   All new parameters are created with the export attribute.

	      -b | -o notify
		   Print  job  notification messages asynchronously instead of
		   just	before the prompt.  Only used with job control (-m).

	      -C | -o noclobber
		   Prevent > redirection from overwriting existing files.  In-
		   stead, >| must be used to force an overwrite.   Note:  This
		   is not safe to use for creation of temporary	files or lock-
		   files  due  to a TOCTOU in a	check allowing one to redirect
		   output to /dev/null or other	device files even in noclobber
		   mode.

	      -e | -o errexit
		   Exit	(after executing the ERR trap) as soon as an error oc-
		   curs	or a command fails (i.e. exits with  a	non-zero  sta-
		   tus).  This does not	apply to commands whose	exit status is
		   explicitly tested by	a shell	construct such as !, if, until
		   or while statements.	 For &&, || and	pipelines (but mind -o
		   pipefail), only the status of the last command is tested.

	      -f | -o noglob
		   Do not expand file name patterns.

	      -h | -o trackall
		   Create  tracked  aliases  for  all  executed	 commands (see
		   "Aliases" above).  Enabled by default  for  non-interactive
		   shells.

	      -i | -o interactive
		   The shell is	an interactive shell.  This option can only be
		   used	when the shell is invoked.  See	above for details.

	      -k | -o keyword
		   Parameter assignments are recognised	anywhere in a command.

	      -l | -o login
		   The	shell  is a login shell.  This option can only be used
		   when	the shell is invoked.  See above for what this means.

	      -m | -o monitor
		   Enable job control (default for interactive shells).

	      -n | -o noexec
		   Do not execute any commands.	 Useful	for checking the  syn-
		   tax of scripts.  Ignored if reading commands	from a tty.

	      -p | -o privileged
		   The	shell  is a privileged shell.  It is set automatically
		   if, when the	shell starts, the real UID  or	GID  does  not
		   match the effective UID (EUID) or GID (EGID), respectively.
		   See above for a description of what this means.

		   If the shell	is privileged, setting this flag after startup
		   files have been processed let it go full setuid and/or set-
		   gid.	  Clearing  this flag makes the	shell drop privileges.
		   Changing this flag resets the groups	vector.

	      -r | -o restricted
		   The shell is	a restricted shell.  This option can  only  be
		   used	 when  the  shell is invoked.  See above for what this
		   means.

	      -s | -o stdin
		   If used when	the shell is invoked, commands are  read  from
		   standard  input.  Set automatically if the shell is invoked
		   with	no arguments.

		   When	-s is used with	the set	command	it causes  the	speci-
		   fied	arguments to be	sorted ASCIIbetically before assigning
		   them	 to  the positional parameters (or to array name, with
		   -A).

	      -U | -o utf8-mode
		   Enable UTF-8	support	in the "Emacs editing mode" and	inter-
		   nal string handling functions.  This	flag  is  disabled  by
		   default, but	can be enabled by setting it on	the shell com-
		   mand	 line; is enabled automatically	for interactive	shells
		   if  requested  at  compile  time,  your   system   supports
		   setlocale(LC_CTYPE,	      "")	 and	    optionally
		   nl_langinfo(CODESET), or the	LC_ALL,	LC_CTYPE or LANG envi-
		   ronment variables, and at least one of these	returns	 some-
		   thing  that	matches	 "UTF-8" or "utf8" case-insensitively;
		   for direct builtin calls depending  on  the	aforementioned
		   environment	variables; or for stdin	or scripts, if the in-
		   put begins with a UTF-8 Byte	Order Mark.

		   In near future, locale tracking will	be implemented,	 which
		   means that set -+U is changed whenever one of the POSIX lo-
		   cale-related	environment variables changes.

	      -u | -o nounset
		   Referencing of an unset parameter, other than "$@" or "$*",
		   is  treated	as an error, unless one	of the `-', `+'	or `='
		   modifiers is	used.

	      -v | -o verbose
		   Write shell input to	standard error as it is	read.

	      -X | -o markdirs
		   Mark	directories with a trailing `/'	during globbing.

	      -x | -o xtrace
		   Print commands when they are	executed, preceded by PS4.

	      -o bgnice
		   Background jobs are run with	lower priority.

	      -o braceexpand
		   Enable brace	expansion.  This is enabled by default.

	      -o emacs
		   Enable BRL  emacs-like  command-line	 editing  (interactive
		   shells  only);  see	"Emacs	editing	mode".	Enabled	by de-
		   fault.

	      -o gmacs
		   Enable gmacs-like command-line editing (interactive	shells
		   only).   Currently  identical  to emacs editing except that
		   transpose-chars (^T)	acts slightly differently.

	      -o ignoreeof
		   The shell will not (easily) exit when end-of-file is	 read;
		   exit	must be	used.  To avoid	infinite loops,	the shell will
		   exit	if EOF is read 13 times	in a row.

	      -o inherit-xtrace
		   Do not reset	-o xtrace upon entering	functions (default).

	      -o nohup
		   Do  not kill	running	jobs with a SIGHUP signal when a login
		   shell exits.	 Currently set by default, but this may	change
		   in the future to be compatible with AT&T  UNIX  ksh,	 which
		   doesn't have	this option, but does send the SIGHUP signal.

	      -o nolog
		   No  effect.	 In  the  original  Korn shell,	this prevented
		   function definitions	from being stored in the history file.

	      -o physical
		   Causes the cd and pwd commands to use "physical" (i.e.  the
		   filesystem's)  ".." directories instead of "logical"	direc-
		   tories (i.e.	the shell handles "..",	which allows the  user
		   to  be  oblivious of	symbolic links to directories).	 Clear
		   by default.	Note that setting this option does not	affect
		   the current value of	the PWD	parameter; only	the cd command
		   changes PWD.	 See cd	and pwd	above for more details.

	      -o pipefail
		   Make	 the  exit status of a pipeline	the rightmost non-zero
		   errorlevel, or zero if all commands exited with zero.

	      -o posix
		   Behave closer to the	standards (see "POSIX  mode"  for  de-
		   tails).   Automatically  enabled  if	 the  shell invocation
		   basename, after `-' and `r' processing,  begins  with  "sh"
		   and	(often	used  for  the lksh binary) this autodetection
		   feature is compiled in.  As a  side	effect,	 setting  this
		   flag	 turns	off the	braceexpand and	utf8-mode flags, which
		   can be turned back on manually, and (unless both are	set in
		   the same command) sh	mode.

	      -o sh
		   Enable kludge /bin/sh compatibility mode (see "SH mode" be-
		   low for details).  Automatically enabled if the basename of
		   the shell invocation, after `-' and `r' processing,	begins
		   with	 "sh"  and  this  autodetection	feature	is compiled in
		   (rather uncommon).  As a side  effect,  setting  this  flag
		   turns off the braceexpand flag, which can be	turned back on
		   manually,  and  posix mode (unless both are set in the same
		   command).

	      -o vi
		   Enable vi(1)-like command-line editing (interactive	shells
		   only).  See "Vi editing mode" for documentation and limita-
		   tions.

	      -o vi-esccomplete
		   In  vi  command-line	editing, do command and	file name com-
		   pletion when	Esc (^[) is entered in command mode.

	      -o vi-tabcomplete
		   In vi command-line editing, do command and file  name  com-
		   pletion when	Tab (^I) is entered in insert mode (default).

	      -o viraw
		   No  effect.	 In  the original Korn shell, unless viraw was
		   set,	the vi command-line mode would let the	tty(4)	driver
		   do the work until Esc was entered.  mksh is always in viraw
		   mode.

	      These  options  can  also	 be used upon invocation of the	shell.
	      The current set of options (with single  letter  names)  can  be
	      found  in	 the  parameter	"$-".  set -o with no option name will
	      list all the options and whether each  is	 on  or	 off;  set  +o
	      prints  a	 command  to restore the current option	set, using the
	      internal set -o .reset construct,	which is an implementation de-
	      tail; these  commands  are  transient  (only  valid  within  the
	      current shell session).

	      Remaining	 arguments,  if	any, are positional parameters and are
	      assigned,	in order, to the positional parameters (i.e.  $1,  $2,
	      etc.).   If options end with "--"	and there are no remaining ar-
	      guments, all positional parameters  are  cleared.	  For  unknown
	      historical  reasons, a lone "-" option is	treated	specially - it
	      clears both the -v and -x	options.  If no	options	 or  arguments
	      are  given,  the	values of all parameters are printed (suitably
	      quoted).

       setenv [name [value]]
	      (dot.mkshrc function) Without arguments, display the  names  and
	      values of	all exported parameters.  Otherwise, set name's	export
	      attribute, and its value to value	(empty string if none given).

       shift [number]
	      (keeps assignments, special) The positional parameters number+1,
	      number+2,	etc.  (number defaults to 1) are renamed to 1, 2, etc.

       sleep seconds
	      (regular,	 needs	select(2)) Suspends execution for a minimum of
	      the seconds (specified as	positive decimal  value	 with  an  op-
	      tional fractional	part).	Signal delivery	may continue execution
	      earlier.

       smores [file ...]
	      (dot.mkshrc  function)  Simple  pager: <Enter> next; `q'+<Enter>
	      quit

       source file [arg	...]
	      (keeps assignments) Like .  ("dot"),  except  that  the  current
	      working  directory  is  appended	to the search path.  (GNU bash
	      extension)

       suspend
	      (needs job control and getsid(2))	Stops the shell	as if  it  had
	      received the suspend character from the terminal.

	      It  is  not  possible to suspend a login shell unless the	parent
	      process is a member of the same terminal session but is a	member
	      of a different process group.  As	a general rule,	if  the	 shell
	      was started by another shell or via su(1), it can	be suspended.

       test expression
       [ expression ]
	      (regular)	 test  evaluates  the expression and exits with	status
	      code 0 if	true, 1	if false, or greater than 1 if	there  was  an
	      error.   It  is  often  used  as the condition command of	if and
	      while statements.	 All file expressions, except -h and -L,  fol-
	      low symbolic links.

	      The following basic expressions are available:

	      -a file		 file exists.

	      -b file		 file is a block special device.

	      -c file		 file is a character special device.

	      -d file		 file is a directory.

	      -e file		 file exists.

	      -f file		 file is a regular file.

	      -G file		 file's	 group	is the shell's effective group
				 ID.

	      -g file		 file's	mode has the setgid bit	set.

	      -H file		 file is a context dependent  directory	 (only
				 useful	on HP-UX).

	      -h file		 file is a symbolic link.

	      -k file		 file's	mode has the sticky(7) bit set.

	      -L file		 file is a symbolic link.

	      -O file		 file's	 owner	is  the	shell's	effective user
				 ID.

	      -p file		 file is a named pipe (FIFO).

	      -r file		 file exists and is readable.

	      -S file		 file is a unix(4)-domain socket.

	      -s file		 file is not empty.

	      -t fd		 File descriptor fd is a tty(4)	device.

	      -u file		 file's	mode has the setuid bit	set.

	      -w file		 file exists and is writable.

	      -x file		 file exists and is executable.

	      file1 -nt	file2	 file1 is newer	than file2 or file1 exists and
				 file2 does not.

	      file1 -ot	file2	 file1 is older	than file2 or file2 exists and
				 file1 does not.

	      file1 -ef	file2	 file1 is the same file	as file2.

	      string		 string	has non-zero length.

	      -n string		 string	is not empty.

	      -z string		 string	is empty.

	      -v name		 The shell parameter name is set.

	      -o option		 Shell option is  set  (see  the  set  command
				 above for a list of options).	As a non-stan-
				 dard  extension,  if the option starts	with a
				 `!', the test is  negated;  the  test	always
				 fails if option doesn't exist (so [ -o	foo -o
				 -o  !foo ] returns true if and	only if	option
				 foo exists).  The same	can be achieved	with [
				 -o ?foo ] like	in AT&T	 UNIX  ksh93.	option
				 can  also be the short	flag prefixed with ei-
				 ther `-' or `+' (no  logical  negation),  for
				 example "-x" or "+x" instead of "xtrace".

	      string = string	 Strings  are equal.  In double	brackets, pat-
				 tern matching (R59+ using extglobs) occurs if
				 the right-hand	string isn't quoted.

	      string ==	string	 Same as `=' (deprecated).

	      string !=	string	 Strings are not  equal.   See	`='  regarding
				 pattern matching.

	      string > string	 First	string	operand	is greater than	second
				 string	operand.

	      string < string	 First string  operand	is  less  than	second
				 string	operand.

	      number -eq number	 Numbers compare equal.

	      number -ne number	 Numbers compare not equal.

	      number -ge number	 Numbers compare greater than or equal.

	      number -gt number	 Numbers compare greater than.

	      number -le number	 Numbers compare less than or equal.

	      number -lt number	 Numbers compare less than.

	      The  above  basic	 expressions,  in  which  unary	operators have
	      precedence over binary operators,	may be combined	with the  fol-
	      lowing operators (listed in increasing order of precedence):

		    expr -o expr	    Logical OR.
		    expr -a expr	    Logical AND.
		    ! expr		    Logical NOT.
		    ( expr )		    Grouping.

	      Note  that  a  number  actually may be an	arithmetic expression,
	      such as a	mathematical term or the name of an integer variable:

		    x=1; [ "x" -eq 1 ]	    evaluates to true

	      Note that	some special rules are applied (courtesy of POSIX)  if
	      the  number  of arguments	to test	or inside the brackets [ ... ]
	      is less than five: if leading "!"	arguments can be stripped such
	      that only	one to three arguments remain, then the	 lowered  com-
	      parison is executed; (thanks to XSI) parentheses \( ... \) lower
	      four-  and  three-argument forms to two- and one-argument	forms,
	      respectively; three-argument forms ultimately prefer binary  op-
	      erations,	 followed  by  negation	and parenthesis	lowering; two-
	      and four-argument	forms prefer negation followed by parenthesis;
	      the one-argument form always implies -n.	To assume this is  not
	      necessarily portable.

	      Note: A common mistake is	to use "if [ $foo = bar	]" which fails
	      if  parameter "foo" is empty or unset, if	it has embedded	spaces
	      (i.e. IFS	octets)	or if it is a unary operator like "!" or "-n".
	      Use tests	like "if [ x"$foo" = x"bar" ]" instead,	or the double-
	      bracket operator (see [[ above): "if [[ $foo = bar  ]]"  or,  to
	      avoid  pattern matching, "if [[ $foo = "$bar" ]]"; the [[	... ]]
	      construct	is not only more secure	to use but also	often faster.

       time [-p] [pipeline]
	      (reserved	word) If a pipeline is given, the times	used  to  exe-
	      cute  the	 pipeline are reported.	 If no pipeline	is given, then
	      the user and system time used by the shell itself, and  all  the
	      commands it has run since	it was started,	are reported.

	      The times	reported are the real time (elapsed time from start to
	      finish),	the  user  CPU time (time spent	running	in user	mode),
	      and the system CPU time (time spent running in kernel mode).

	      Times are	reported to standard error; the	format of  the	output
	      is:

		    0m0.03s real     0m0.02s user     0m0.01s system

	      If  the  -p option is given (which is only permitted if pipeline
	      is a simple command), the	output is slightly longer:

		    real     0.03
		    user     0.02
		    sys	     0.01

	      Simple redirections of  standard	error  do  not	affect	time's
	      output:

		    $ time sleep 1 2>afile
		    $ {	time sleep 1; }	2>afile

	      Times  for  the first command do not go to "afile", but those of
	      the second command do.

       times  (keeps assignments, special) Print the accumulated user and sys-
	      tem times	(see above) used both by the shell  and	 by  processes
	      that  the	 shell	started	 which have exited.  The format	of the
	      output is:

		    0m0.01s 0m0.00s
		    0m0.04s 0m0.02s

       trap n [signal ...]
	      (keeps assignments, special) If the first	operand	is  a  decimal
	      unsigned	integer,  this resets all specified signals to the de-
	      fault action, i.e. is the	same as	calling	trap with a dash ("-")
	      as handler, followed by the arguments (interpreted as signals).

       trap [handler signal ...]
	      (keeps assignments, special) Sets	a trap handler that is	to  be
	      executed	when  any  of  the  specified  signals	are  received.
	      handler is either	an empty string, indicating the	signals	are to
	      be ignored, a dash ("-"),	indicating that	the default action  is
	      to  be  taken  for the signals (see signal(3)), or a string com-
	      prised of	shell commands to be executed at the first opportunity
	      (i.e. when the current command completes or before printing  the
	      next PS1 prompt) after receipt of	one of the signals.  signal is
	      the  name, possibly prefixed with	"SIG", of a signal (e.g. PIPE,
	      ALRM or SIGINT) or the number of the signal  (see	 the  kill  -l
	      command above).

	      There  are two special signals: EXIT (also known as 0), which is
	      executed when the	shell is about to exit,	and ERR, which is exe-
	      cuted after an error occurs; an error is	something  that	 would
	      cause  the  shell	to exit	if the set -e or set -o	errexit	option
	      were set.	 EXIT handlers are executed in the environment of  the
	      last executed command.  The original Korn	shell's	DEBUG trap and
	      handling of ERR and EXIT in functions are	not yet	implemented.

	      Note  that,  for non-interactive shells, the trap	handler	cannot
	      be changed for signals that were ignored when the	shell started.

	      With no arguments, the current state of the traps	that have been
	      set since	the shell started is shown as a	series	of  trap  com-
	      mands.  Note that	the output of trap cannot be usefully captured
	      or  piped	to another process (an artifact	of the fact that traps
	      are cleared when subprocesses are	created).

       true   (regular)	A command that exits with a zero status.

       type name ...
	      (built-in	alias) Reveal how name would be	 interpreted  as  com-
	      mand.

       typeset	[-+aglpnrtUux]	[-L[n] | -R[n] | -Z[n]]	[-i[n]]	[name [=value]
	      ...]
       typeset -f [-tux] [name ...]
	      (keeps assignments, decl-util)  Display  or  set	attributes  of
	      shell  parameters	or functions.  With no name arguments, parame-
	      ter attributes are shown;	if no options are  used,  the  current
	      attributes of all	parameters are printed as typeset commands; if
	      an  option  is given (or "-" with	no option letter), all parame-
	      ters and their values with the specified attributes are printed;
	      if options are introduced	with `+' (or "+"  alone),  only	 names
	      are printed.

	      If  any name arguments are given,	the attributes of the so named
	      parameters are set (-) or	cleared	(+); inside a  function,  this
	      will  cause  the	parameters  to be created (and set to "" if no
	      value is given) in the local scope (except if -g is used).  Val-
	      ues for parameters may optionally	be  specified.	 For  name[*],
	      the  change  affects all elements	of the array, and no value may
	      be specified.

	      When -f is used, typeset operates	on  the	 attributes  of	 func-
	      tions.   As  with	 parameters,  if  no name arguments are	given,
	      functions	are listed with	their values (i.e. definitions)	unless
	      options are introduced with `+', in which	case  only  the	 names
	      are displayed.

	      -a      Indexed array attribute.

	      -f      Function mode.  Display or set shell functions and their
		      attributes, instead of shell parameters.

	      -g      "global" mode.  Do not cause named parameters to be cre-
		      ated in the local	scope when called inside a function.

	      -i[n]   Integer  attribute.   n  specifies  the base to use when
		      stringifying the integer (if  not	 specified,  the  base
		      given in the first assignment is used).  Parameters with
		      this  attribute  may  be assigned	arithmetic expressions
		      for values.

	      -L[n]   Left justify attribute.  n specifies  the	 field	width.
		      If  n is not specified, the current width	of the parame-
		      ter (or the width	of its first assigned value) is	 used.
		      Leading whitespace (and digit zeros, if used with	the -Z
		      option)  is  stripped.   If necessary, values are	either
		      truncated	or padded with space to	fit the	field width.

	      -l      Lower case attribute.  All upper case  ASCII  characters
		      in values	are converted to lower case.  (In the original
		      Korn  shell,  this  parameter  meant "long integer" when
		      used with	the -i option.)

	      -n      Create a bound variable (name reference):	any access  to
		      the  variable name will access the variable value	in the
		      current scope (this is different from AT&T UNIX  ksh93!)
		      instead.	 Also  different  from AT&T UNIX ksh93 is that
		      value is lazily evaluated	at the time name is  accessed.
		      This  can	be used	by functions to	access variables whose
		      names are	passed as parameters, instead of resorting  to
		      eval.

	      -p      Print  complete typeset commands that can	be used	to re-
		      create the attributes and	values of parameters.

	      -R[n]   Right justify attribute.	n specifies the	 field	width.
		      If  n is not specified, the current width	of the parame-
		      ter (or the width	of its first assigned value) is	 used.
		      Trailing	whitespace  is stripped.  If necessary,	values
		      are either stripped of leading characters	or padded with
		      space to fit the field width.

	      -r      Read-only	attribute.  Parameters with this attribute may
		      not be assigned to or unset.   Once  this	 attribute  is
		      set, it cannot be	turned off.

	      -t      Tag  attribute.	This  attribute	 has no	meaning	to the
		      shell for	parameters and	is  provided  for  application
		      use.

		      For  functions,  -t  is the trace	attribute.  When func-
		      tions with the trace  attribute  are  executed,  the  -o
		      xtrace (-x) shell	option is temporarily turned on.

	      -U      Unsigned integer attribute.  Integers are	printed	as un-
		      signed values (combined with the -i option).

	      -u      Upper  case  attribute.  All lower case ASCII characters
		      in values	are converted to upper case.  (In the original
		      Korn shell, this parameter meant "unsigned integer" when
		      used with	the -i option which meant upper	 case  letters
		      would  never  be used for	bases greater than 10.	See -U
		      above.)

		      For functions, -u	is the undefined attribute, used  with
		      FPATH.   See  "Functions"	 above for the implications of
		      this.

	      -x      Export attribute.	 Parameters are	placed in the environ-
		      ment of any executed commands.  Functions	cannot be  ex-
		      ported for security reasons ("shellshock").

	      -Z[n]   Zero  fill  attribute.  If not combined with -L, this is
		      the same as -R, except zero padding is used  instead  of
		      space  padding.  For integers, the number	is padded, not
		      the base.

	      If any of	the -i,	-L, -l,	-R, -U,	-u or -Z options are  changed,
	      all others from this set are cleared, unless they	are also given
	      on the same command line.

       ulimit [-aBCcdefHilMmnOPpqrSsTtVvwx] [value]
	      (regular)	 Display  or  set  process  limits.  If	no options are
	      used, the	file size limit	(-f) is	assumed.  value, if specified,
	      may be either an arithmetic expression or	the word  "unlimited".
	      The  limits  affect  the	shell and any processes	created	by the
	      shell after a limit is imposed.  Note that systems may not allow
	      some limits to be	increased once they are	set.  Also  note  that
	      the  types  of limits available are system dependent - some sys-
	      tems have	only the -f limit, or not even that, or	can  set  only
	      the soft limits, etc.

	      -a     Display all limits	(soft limits unless -H is used).

	      -B n   Set the socket buffer size	to n kibibytes.

	      -C n   Set the number of cached threads to n.

	      -c n   Impose  a	size  limit  of	 n  blocks on the size of core
		     dumps.  Silently ignored if the system does  not  support
		     this limit.

	      -d n   Limit the size of the data	area to	n kibibytes.
		     On	 some  systems,	 read-only  maximum  brk(2) size minus
		     etext.

	      -e n   Set the maximum niceness to n.

	      -f n   Impose a size limit of n blocks on	files written  by  the
		     shell and its child processes (any	size may be read).

	      -H     Set  the hard limit only (the default is to set both hard
		     and soft limits).	With -a, display all hard limits.

	      -i n   Set the number of pending signals to n.

	      -l n   Impose a limit of n kibibytes on  the  amount  of	locked
		     (wired) physical memory.

	      -M n   Set the AIO locked	memory to n kibibytes.

	      -m n   Impose  a	limit of n kibibytes on	the amount of physical
		     memory used.

	      -n n   Impose a limit of n file descriptors that can be open  at
		     once.   On	 some systems attempts to set are silently ig-
		     nored.

	      -O n   Set the number of AIO operations to n.

	      -P n   Limit the number of threads per process to	n.

		     This option mostly	matches	AT&T UNIX ksh93's -T;
		     on	AIX, see -r as used by its ksh though.

	      -p n   Impose a limit of n processes that	can be run by the user
		     (uid) at any one time.

	      -q n   Limit the size of POSIX message queues to n bytes.

	      -r n   (AIX) Limit the number of threads per process to n.
		     (Linux) Set the maximum real-time priority	to n.

	      -S     Set the soft limit	only (the default is to	set both  hard
		     and  soft	limits).   With	 -a,  display soft limits (de-
		     fault).

	      -s n   Limit the size of the stack area to n kibibytes.

	      -T n   Impose a time limit of n real seconds ("humantime") to be
		     used by each process.

	      -t n   Impose a time limit of n CPU seconds spent	in  user  mode
		     to	be used	by each	process.

	      -V n   Set the number of vnode monitors on Haiku to n.

	      -v n   Impose  a	limit  of n kibibytes on the amount of virtual
		     memory (address space) used.

	      -w n   Limit the	amount	of  swap  space	 used  to  at  most  n
		     kibibytes.

	      -x n   Set the maximum number of file locks to n.

	      As far as	ulimit is concerned, a block is	512 bytes.

       umask [-S] [mask]
	      (regular)	 Display  or  set the file permission creation mask or
	      umask (see umask(2)).  If	the -S option is used, the  mask  dis-
	      played or	set is symbolic; otherwise, it is an octal number.

	      Symbolic masks are like those used by chmod(1).  When used, they
	      describe	what  permissions may be made available	(as opposed to
	      octal masks in which a set bit means the corresponding bit is to
	      be cleared).  For	example, "ug=rwx,o=" sets the  mask  so	 files
	      will not be readable, writable or	executable by "others",	and is
	      equivalent (on most systems) to the octal	mask "007".

       unalias [-adt] [name ...]
	      (regular)	 The  aliases for the given names are removed.	If the
	      -a option	is used, all aliases are removed.  If the -t or	-d op-
	      tions are	used, the indicated  operations	 are  carried  out  on
	      tracked or directory aliases, respectively.

       unset [-fv] parameter ...
	      (keeps assignments, special) Unset the named parameters (-v, the
	      default)	or  functions (-f).  With parameter[*],	attributes are
	      retained,	only values are	unset.	The exit status	is non-zero if
	      any  of  the  parameters	are  read-only,	 zero  otherwise  (not
	      portable).

       wait [job ...]
	      (regular)	 Wait  for  the	 specified job(s) to finish.  The exit
	      status of	wait is	that of	the last specified job;	 if  the  last
	      job  is  killed by a signal, the exit status is 128 + the	signal
	      number (see kill -l exit-status above); if  the  last  specified
	      job  cannot  be  found  (because it never	existed	or had already
	      finished), the exit status is 127.  See "Job control" below  for
	      the  format  of  job.   wait will	return if a signal for which a
	      trap has been set	is received or if a SIGHUP, SIGINT or  SIGQUIT
	      signal is	received.

	      If  no  jobs are specified, wait waits for all currently running
	      jobs (if any) to finish and exits	with a zero  status.   If  job
	      monitoring  is enabled, the completion status of jobs is printed
	      (this is not the case when jobs are explicitly specified).

       whence [-pv] [name ...]
	      (regular)	Without	the -v option, it is the same as  command  -v,
	      except  aliases  are printed as their definition only.  With the
	      -v option, it is exactly identical to  command  -V.   In	either
	      case,  with  the -p option the search is restricted to the (cur-
	      rent) PATH.

       which [-a] [name	...]
	      (dot.mkshrc function) Without -a,	behaves	like whence -p (does a
	      PATH search for each name	printing  the  resulting  pathname  if
	      found);  with  -a,  matches  in all PATH components are printed,
	      i.e. the search is not stopped after a match.  If	 no  name  was
	      matched,	the exit status	is 2; if every name was	matched, it is
	      zero, otherwise it is 1.	No diagnostics are produced on failure
	      to match.

   Job control
       Job control refers to the shell's ability to monitor and	 control  jobs
       which  are  processes  or  groups  of processes created for commands or
       pipelines.  At a	minimum, the shell keeps track of the  status  of  the
       background (i.e.	asynchronous) jobs that	currently exist; this informa-
       tion can	be displayed using the jobs commands.  If job control is fully
       enabled	(using	set  -m	 or  set -o monitor), as it is for interactive
       shells, the processes of	a job are placed in their own  process	group.
       Foreground jobs can be stopped by typing	the suspend character from the
       terminal	 (normally ^Z);	jobs can be restarted in either	the foreground
       or background using the commands	fg and bg.

       Note that only commands that create processes (e.g.  asynchronous  com-
       mands,  subshell	 commands and non-built-in, non-function commands) can
       be stopped; commands like read cannot be.

       When a job is created, it is assigned a job  number.   For  interactive
       shells,	this number is printed inside "[...]", followed	by the process
       IDs of the processes in the job when an asynchronous command is run.  A
       job may be referred to in the bg, fg, jobs, kill	and wait commands  ei-
       ther  by	the process ID of the last process in the command pipeline (as
       stored in the $!	parameter) or by prefixing the job number with a  per-
       cent  sign (`%').  Other	percent	sequences can also be used to refer to
       jobs:

       %+ | %% | %    The most recently	 stopped  job  or,  if	there  are  no
		      stopped jobs, the	oldest running job.

       %-	      The  job	that would be the %+ job if the	latter did not
		      exist.

       %n	      The job with job number n.

       %?string	      The job with its command containing  the	string	string
		      (an error	occurs if multiple jobs	are matched).

       %string	      The job with its command starting	with the string	string
		      (an error	occurs if multiple jobs	are matched).

       When  a job changes state (e.g. a background job	finishes or foreground
       job is stopped),	the shell prints the following status information:

	     [number] flag status command

       where...

       number	is the job number of the job;

       flag	is the `+' or `-' character if the job is the %+  or  %-  job,
		respectively, or space if it is	neither;

       status	indicates the current state of the job and can be:

		Done [number]
			   The	job  exited.  number is	the exit status	of the
			   job which is	omitted	if the status is zero.

		Running	   The job has neither stopped nor exited  (note  that
			   running  does  not  necessarily  mean consuming CPU
			   time	- the process could  be	 blocked  waiting  for
			   some	event).

		Stopped	[signal]
			   The	job was	stopped	by the indicated signal	(if no
			   signal is given, the	job was	stopped	by SIGTSTP).

		signal-description ["core dumped"]
			   The job was killed by a signal (e.g.	memory	fault,
			   hangup);  use kill -l for a list of signal descrip-
			   tions.  The "core  dumped"  message	indicates  the
			   process created a core file.

       command	is  the	command	that created the process.  If there are	multi-
		ple processes in the job, each process will have a line	 show-
		ing  its  command  and possibly	its status, if it is different
		from the status	of the previous	process.

       When an attempt is made to exit the shell while there are jobs  in  the
       stopped state, the shell	warns the user that there are stopped jobs and
       does  not  exit.	  If  another  attempt is immediately made to exit the
       shell, the stopped jobs are sent	a SIGHUP signal	and the	 shell	exits.
       Similarly,  if  the  nohup option is not	set and	there are running jobs
       when an attempt is made to exit a login shell, the shell	warns the user
       and does	not exit.  If another attempt is immediately made to exit  the
       shell, the running jobs are sent	a SIGHUP signal	and the	shell exits.

   Terminal state
       The state of the	controlling terminal can be modified by	a command exe-
       cuted in	the foreground,	whether	or not job control is enabled, but the
       modified	 terminal  state is only kept past the job's lifetime and used
       for later command invocations if	the command exits  successfully	 (i.e.
       with  an	 exit status of	0).  When such a job is	momentarily stopped or
       restarted, the terminal state is	saved and restored, respectively,  but
       it will not be kept afterwards.	In interactive mode, when line editing
       is  enabled,  the  terminal state is saved before being reconfigured by
       the shell for the line editor, then restored before running a command.

   POSIX mode
       Entering	set -o posix mode will cause mksh to behave  even  more	 POSIX
       compliant  in  places where the defaults	or opinions differ.  Note that
       mksh will still operate with unsigned 32-bit arithmetic;	 use  lksh  if
       arithmetic  on  the  host long data type, complete with ISO C Undefined
       Behaviour, is required; refer to	the lksh(1) manual page	 for  details.
       Most  other  historic,  AT&T UNIX ksh-compatible	or opinionated differ-
       ences can be disabled by	using this mode; these are:

          The incompatible GNU	bash I/O redirection &>file is not supported.

          File	descriptors created by I/O redirections	are inherited by child
	   processes.

          Numbers with	a leading digit	zero are interpreted as	octal.

          The echo builtin does not interpret backslashes and	only  supports
	   the exact option -n.

          Alias expansion with	a trailing space only reruns on	command	words.

          Tilde expansion follows POSIX instead of Korn shell rules.

          The exit status of fg is always 0.

          kill	-l only	lists signal names, all	in one line.

          getopts does	not accept options with	a leading `+'.

          exec	 skips	builtins, functions and	other commands and uses	a PATH
	   search to determine the utility to execute.

   SH mode
       Compatibility mode; intended for	use with legacy	 scripts  that	cannot
       easily be fixed;	the changes are	as follows:

          The incompatible GNU	bash I/O redirection &>file is not supported.

          File	descriptors created by I/O redirections	are inherited by child
	   processes.

          The	echo  builtin does not interpret backslashes and only supports
	   the	   exact      option	  -n,	   unless      built	  with
	   -DMKSH_MIDNIGHTBSD01ASH_COMPAT.

          The	substitution  operations  ${x#pat},  ${x##pat},	 ${x%pat}, and
	   ${x%%pat} wrongly do	not require a parenthesis to be	escaped	and do
	   not parse extglobs.

          The getopt construct	from lksh(1) passes through the	errorlevel.

          sh	 -c    eats	a     leading	  --	 if	built	  with
	   -DMKSH_MIDNIGHTBSD01ASH_COMPAT.

   Interactive input line editing
       The  shell  supports three modes	of reading command lines from a	tty(4)
       in an interactive session, controlled by	the emacs, gmacs  and  vi  op-
       tions (at most one of these can be set at once).	 The default is	emacs.
       Editing modes can be set	explicitly using the set built-in.  If none of
       these  options are enabled, the shell simply reads lines	using the nor-
       mal tty(4) driver.  If the emacs	or gmacs option	is set,	the shell  al-
       lows  emacs-like	editing	of the command;	similarly, if the vi option is
       set, the	shell allows vi-like editing of	the command.  These modes  are
       described in detail in the following sections.

       In  these editing modes,	if a line is longer than the screen width (see
       the COLUMNS parameter), a `>', `+' or `<' character is displayed	in the
       last column indicating that there are more characters after, before and
       after, or before	the  current  position,	 respectively.	 The  line  is
       scrolled	horizontally as	necessary.

       Completed  lines	are pushed into	the history, unless they begin with an
       IFS octet or IFS	white space or are the same as the previous line.

   Emacs editing mode
       When the	emacs option is	set, interactive input	line  editing  is  en-
       abled.  Warning:	This mode is slightly different	from the emacs mode in
       the original Korn shell.	 In this mode, various editing commands	(typi-
       cally  bound to one or more control characters) cause immediate actions
       without waiting for a newline.  Several editing commands	are  bound  to
       particular control characters when the shell is invoked;	these bindings
       can be changed using the	bind command.

       The  following  is a list of available editing commands.	 Each descrip-
       tion starts with	the name of the	command, suffixed with a colon;	an [n]
       (if the command can be prefixed with a count); and any keys the command
       is bound	to by default, written using caret notation e.g. the ASCII Esc
       character is written as ^[.  These control sequences are	not case  sen-
       sitive.	 A  count  prefix  for a command is entered using the sequence
       ^[n, where n is a sequence of 1 or more digits.	Unless otherwise spec-
       ified, if a count is omitted, it	defaults to 1.

       Note that editing command names are used	only with  the	bind  command.
       Furthermore,  many editing commands are useful only on terminals	with a
       visible cursor.	The user's tty(4) characters (e.g. ERASE) are bound to
       reasonable substitutes and override the default bindings; their custom-
       ary values are shown in parentheses below.  The default	bindings  were
       chosen to resemble corresponding	Emacs key bindings:

       abort: INTR (^C), ^G
	       Abort  the  current  command, save it to	the history, empty the
	       line buffer and set the exit state to interrupted.

       auto-insert: [n]
	       Simply causes the character to appear as	literal	 input.	  Most
	       ordinary	characters are bound to	this.

       backward-char: [n] ^B, ^XD, ANSI-CurLeft, PC-CurLeft
	       Moves the cursor	backward n characters.

       backward-word: [n] ^[b, ANSI-Ctrl-CurLeft, ANSI-Alt-CurLeft
	       Moves  the  cursor backward to the beginning of the word; words
	       consist of alphanumerics,  underscore  (`_')  and  dollar  sign
	       (`$') characters.

       beginning-of-history: ^[<
	       Moves to	the beginning of the history.

       beginning-of-line: ^A, ANSI-Home, PC-Home
	       Moves the cursor	to the beginning of the	edited input line.

       capitalise-word:	[n] ^[C, ^[c
	       Uppercase  the first ASCII character in the next	n words, leav-
	       ing the cursor past the end of the last word.

       clear-screen: ^[^L
	       Prints a	compile-time configurable sequence to clear the	screen
	       and home	the cursor, redraws the	last line of the prompt	string
	       and the currently edited	 input	line.	The  default  sequence
	       works for almost	all standard terminals.

       comment:	^[#
	       If  the	current	 line does not begin with a comment character,
	       one is added at the beginning of	the line and the line  is  en-
	       tered  (as if return had	been pressed); otherwise, the existing
	       comment characters are removed and the cursor is	placed at  the
	       beginning of the	line.

       complete: ^[^[
	       Automatically  completes	 as  much  as is unique	of the command
	       name or the file	name containing	the cursor.  If	the entire re-
	       maining command or file name is unique, a space is printed  af-
	       ter its completion, unless it is	a directory name in which case
	       `/'  is appended.  If there is no command or file name with the
	       current partial word as its prefix, a bell character is	output
	       (usually	causing	a beep to be sounded).

       complete-command: ^X^[
	       Automatically  completes	 as  much  as is unique	of the command
	       name having the partial word up to the cursor as	its prefix, as
	       in the complete command above.

       complete-file: ^[^X
	       Automatically completes as much as is unique of the  file  name
	       having  the  partial word up to the cursor as its prefix, as in
	       the complete command described above.

       complete-list: ^I, ^[=
	       Complete	as much	as is possible of the current  word  and  list
	       the  possible  completions  for	it.  If	only one completion is
	       possible, match as in the complete command above.  Note that ^I
	       is usually generated by the Tab (tabulator) key.

       delete-char-backward: [n] ERASE (^H), ^?, ^H
	       Deletes n characters before the cursor.

       delete-char-forward: [n]	ANSI-Del, PC-Del
	       Deletes n characters after the cursor.

       delete-word-backward: [n] Pfx1+ERASE (^[^H), WERASE (^W),  ^[^?,	 ^[^H,
	       ^[h
	       Deletes n words before the cursor.

       delete-word-forward: [n]	^[d
	       Deletes characters after	the cursor up to the end of n words.

       down-history: [n] ^N, ^XB, ANSI-CurDown,	PC-CurDown
	       Scrolls the history buffer forward n lines (later).  Each input
	       line originally starts just after the last entry	in the history
	       buffer,	 so   down-history   is	  not	useful	 until	either
	       search-history, search-history-up or up-history has  been  per-
	       formed.

       downcase-word: [n] ^[L, ^[l
	       Lowercases the next n words.

       edit-line: [n] ^Xe
	       Internally  run the command fc -e "${VISUAL:-${EDITOR:-vi}}" --
	       n
	       on a temporary script file to interactively edit	line n	(if  n
	       is  not	specified,  the	current	line); then, unless the	editor
	       invoked exits nonzero but even if the script was	 not  changed,
	       execute	the  resulting script as if typed on the command line;
	       both the	edited (resulting) and original	lines are  added  onto
	       history.

       end-of-history: ^[>
	       Moves to	the end	of the history.

       end-of-line: ^E,	ANSI-End, PC-End
	       Moves the cursor	to the end of the input	line.

       eot: ^_
	       Acts  as	an end-of-file;	this is	useful because edit-mode input
	       disables	normal terminal	input canonicalisation.

       eot-or-delete: [n] EOF (^D)
	       If   alone   on	 a   line,    same    as    eot,    otherwise,
	       delete-char-forward.

       error: (not bound)
	       Error (ring the bell).

       evaluate-region:	^[^E
	       Evaluates  the  text  between  the mark and the cursor position
	       (the entire line	if no mark is set)  as	function  substitution
	       (if it cannot be	parsed,	the editing state is unchanged and the
	       bell is rung to signal an error); $? is updated accordingly.

       exchange-point-and-mark:	^X^X
	       Places  the cursor where	the mark is and	sets the mark to where
	       the cursor was.

       expand-file: ^[*
	       Appends a `*' to	the current word and replaces  the  word  with
	       the  result  of	performing  file  globbing on the word.	 If no
	       files match the pattern,	the bell is rung.

       forward-char: [n] ^F, ^XC, ANSI-CurRight, PC-CurRight
	       Moves the cursor	forward	n characters.

       forward-word: [n] ^[f, ANSI-Ctrl-CurRight, ANSI-Alt-CurRight
	       Moves the cursor	forward	to the end of the nth word.

       goto-history: [n] ^[g
	       Goes to history number n.

       kill-line: KILL (^U)
	       Deletes the entire input	line.

       kill-region: ^W
	       Deletes the input between the cursor and	the mark.

       kill-to-eol: [n]	^K
	       Deletes the input from the cursor to the	end of the line	 if  n
	       is not specified; otherwise deletes characters between the cur-
	       sor and column n.

       list: ^[?
	       Prints a	sorted,	columnated list	of command names or file names
	       (if any)	that can complete the partial word containing the cur-
	       sor.  Directory names have `/' appended to them.

       list-command: ^X?
	       Prints a	sorted,	columnated list	of command names (if any) that
	       can complete the	partial	word containing	the cursor.

       list-file: ^X^Y
	       Prints  a  sorted,  columnated list of file names (if any) that
	       can complete the	partial	word containing	the cursor.  File type
	       indicators are appended as described under list above.

       newline:	^J, ^M
	       Causes the current input	line to	be  processed  by  the	shell.
	       The current cursor position may be anywhere on the line.

       newline-and-next: ^O
	       Causes the current input	line to	be processed by	the shell, and
	       the  next  line from history becomes the	current	line.  This is
	       only   useful   after   an   up-history,	  search-history    or
	       search-history-up.

       no-op: QUIT (^\)
	       This does nothing.

       prefix-1: ^[
	       Introduces a 2-character	command	sequence.

       prefix-2: ^X, ^[[, ^[O
	       Introduces a multi-character command sequence.

       prev-hist-word: [n] ^[.,	^[_
	       The  last  word	or, if given, the nth word (zero-based)	of the
	       previous	(on repeated execution,	second-last, third-last, etc.)
	       command is inserted at the cursor.  Use of this editing command
	       trashes the mark.

       quote: ^^, ^V
	       The following character is taken	literally rather  than	as  an
	       editing command.

       quote-region: ^[Q
	       Escapes	the text between the mark and the cursor position (the
	       entire line if no mark is set) into a shell command argument.

       redraw: ^L
	       Reprints	the last line of the prompt string and the current in-
	       put line	on a new line.

       search-character-backward: [n] ^[^]
	       Search backward in the current line for the nth	occurrence  of
	       the next	character typed.

       search-character-forward: [n] ^]
	       Search  forward	in  the	current	line for the nth occurrence of
	       the next	character typed.

       search-history: ^R
	       Enter incremental search	mode.  The internal  history  list  is
	       searched	backwards for commands matching	the input.  An initial
	       `^'  in	the  search string anchors the search.	The escape key
	       will leave search mode.	Other commands,	including sequences of
	       escape as prefix-1 followed by a	prefix-1 or prefix-2 key  will
	       be  executed after leaving search mode.	The abort (^G) command
	       will restore the	input line before search started.   Successive
	       search-history commands continue	searching backward to the next
	       previous	occurrence of the pattern.  The	history	buffer retains
	       only a finite number of lines; the oldest are discarded as nec-
	       essary.

       search-history-up: ANSI-PgUp, PC-PgUp
	       Search  backwards through the history buffer for	commands whose
	       beginning match the portion of the input	line before  the  cur-
	       sor.   When  used on an empty line, this	has the	same effect as
	       up-history.

       search-history-down: ANSI-PgDn, PC-PgDn
	       Search forwards through the history buffer for  commands	 whose
	       beginning  match	 the portion of	the input line before the cur-
	       sor.  When used on an empty line, this has the same  effect  as
	       down-history.	This  is  only	useful	after  an  up-history,
	       search-history or search-history-up.

       set-mark-command: ^[<space>
	       Set the mark at the cursor position.

       transpose-chars:	^T
	       If at the end of	line or, if the	gmacs option is	set, this  ex-
	       changes	the  two  previous characters; otherwise, it exchanges
	       the previous and	current	characters and moves  the  cursor  one
	       character to the	right.

       up-history: [n] ^P, ^XA,	ANSI-CurUp, PC-CurUp
	       Scrolls the history buffer backward n lines (earlier).

       upcase-word: [n]	^[U, ^[u
	       Uppercase the next n words.

       version:	^[^V
	       Display	the  version  of mksh.	The current edit buffer	is re-
	       stored as soon as a key is pressed.  The	restoring keypress  is
	       processed, unless it is a space.

       yank: ^Y
	       Inserts	the  most  recently  killed text string	at the current
	       cursor position.

       yank-pop: ^[y
	       Immediately after a yank, replaces  the	inserted  text	string
	       with the	next previously	killed text string.

       The  tab	 completion  escapes  characters the same way as the following
       code:

       print -nr -- "${x@/[\"-\$\&-*:-?[\\\`\{-\}${IFS-$' \t\n'}]/\\$KSH_MATCH}"

   Vi editing mode
       Note: The vi command-line editing mode has not yet been brought	up  to
       the  same quality and feature set as the	emacs mode.  It	is 8-bit clean
       but specifically	does not support UTF-8 or MBCS.

       The vi command-line editor in mksh has basically	the same  commands  as
       the vi(1) editor	with the following exceptions:

          You start out in insert mode.

          There  are  file name and command completion	commands: =, \,	*, ^X,
	   ^E, ^F and, optionally, <Tab> and <Esc>.

          The _ command is different (in mksh,	it is the last	argument  com-
	   mand; in vi(1) it goes to the start of the current line).

          The	/  and G commands move in the opposite direction to the	j com-
	   mand.

          Commands which don't	make sense in a	single	line  editor  are  not
	   available  (e.g. screen movement commands and ex(1)-style colon (:)
	   commands).

       Like vi(1), there are two modes:	"insert" mode and "command" mode.   In
       insert  mode,  most characters are simply put in	the buffer at the cur-
       rent cursor position as they are	typed; however,	 some  characters  are
       treated	specially.   In	particular, the	following characters are taken
       from current tty(4) settings (see stty(1)) and have their usual meaning
       (normal values are in parentheses): kill	(^U), erase (^?), werase (^W),
       eof (^D), intr (^C) and quit (^\).  In addition to the above, the  fol-
       lowing characters are also treated specially in insert mode:

       ^E	Command	and file name enumeration (see below).

       ^F	Command	 and  file name	completion (see	below).	 If used twice
		in a row, the list of possible completions  is	displayed;  if
		used a third time, the completion is undone.

       ^H	Erases previous	character.

       ^J | ^M	End of line.  The current line is read,	parsed and executed by
		the shell.

       ^V	Literal	 next.	 The  next character typed is not treated spe-
		cially (can be used to insert the characters  being  described
		here).

       ^X	Command	and file name expansion	(see below).

       <Esc>	Puts the editor	in command mode	(see below).

       <Tab>	Optional  file name and	command	completion (see	^F above), en-
		abled with set -o vi-tabcomplete.

       In command mode,	each character is interpreted as a  command.   Charac-
       ters  that  don't  correspond  to commands, are illegal combinations of
       commands, or are	commands that can't be carried out, all	 cause	beeps.
       In the following	command	descriptions, an [n] indicates the command may
       be  prefixed  by	 a  number (e.g. 10l moves right 10 characters); if no
       number prefix is	used, n	is assumed to be 1 unless otherwise specified.
       The term	"current position" refers to the position between  the	cursor
       and the character preceding the cursor.	A "word" is a sequence of let-
       ters,  digits  and  underscore  characters or a sequence	of non-letter,
       non-digit, non-underscore and non-whitespace characters (e.g.  "ab2*&^"
       contains	 two  words)  and a "big-word" is a sequence of	non-whitespace
       characters.

       Special mksh vi commands:

       The following commands are not in, or are different from, the normal vi
       file editor:

       [n]_	   Insert a space followed by the nth big-word from  the  last
		   command  in	the  history at	the current position and enter
		   insert mode;	if n is	not specified, the last	 word  is  in-
		   serted.

       #	   Insert the comment character	(`#') at the start of the cur-
		   rent	 line  and return the line to the shell	(equivalent to
		   I#^J).

       [n]g	   Like	G, except if n is not specified, it goes to  the  most
		   recent remembered line.

       [n]v	   Internally run the command fc -e "${VISUAL:-${EDITOR:-vi}}"
		   -- n
		   on a	temporary script file to interactively edit line n (if
		   n is	not specified, the current line); then,	unless the ed-
		   itor	 invoked  exits	nonzero	but even if the	script was not
		   changed, execute the	resulting script as if	typed  on  the
		   command  line;  both	 the  edited  (resulting) and original
		   lines are added onto	history.

       * and ^X	   Command or file name	expansion is applied  to  the  current
		   big-word (with an appended `*' if the word contains no file
		   globbing  characters) - the	big-word  is replaced with the
		   resulting words.  If	the current big-word is	the  first  on
		   the	line  or  follows one of the characters	`;', `|', `&',
		   `(' or `)' and does not contain a slash (`/'), then command
		   expansion is	done; otherwise	file name expansion  is	 done.
		   Command  expansion  will  match  the	 big-word  against all
		   aliases, functions and built-in commands as well as any ex-
		   ecutable files found	by searching the  directories  in  the
		   PATH	 parameter.   File name	expansion matches the big-word
		   against the files in	the current directory.	 After	expan-
		   sion,  the cursor is	placed just past the last word and the
		   editor is in	insert mode.

       [n]\, [n]^F, [n]<Tab>, and [n]<Esc>
		   Command/file	name completion.  Replace the current big-word
		   with	the longest unique  match  obtained  after  performing
		   command  and	file name expansion.  <Tab> is only recognised
		   if the vi-tabcomplete option	is set,	while  <Esc>  is  only
		   recognised  if  the	vi-esccomplete	option is set (see set
		   -o).	 If n is specified, the	nth possible completion	is se-
		   lected (as reported by the  command/file  name  enumeration
		   command).

       = and ^E	   Command/file	 name  enumeration.   List all the commands or
		   files that match the	current	big-word.

       ^V	   Display the version of mksh.	 The current  edit  buffer  is
		   restored  as	 soon as a key is pressed.  The	restoring key-
		   press is ignored.

       @c	   Macro expansion.  Execute the commands found	in  the	 alias
		   _c.

       Intra-line movement commands:

       [n]h and	[n]^H
	       Move left n characters.

       [n]l and	[n]<space>
	       Move right n characters.

       0       Move to column 0.

       ^       Move to the first non-whitespace	character.

       [n]|    Move to column n.

       $       Move to the last	character.

       [n]b    Move back n words.

       [n]B    Move back n big-words.

       [n]e    Move forward to the end of the word, n times.

       [n]E    Move forward to the end of the big-word,	n times.

       [n]w    Move forward n words.

       [n]W    Move forward n big-words.

       %       Find match.  The	editor looks forward for the nearest parenthe-
	       sis, bracket or brace and then moves the	cursor to the matching
	       parenthesis, bracket or brace.

       [n]fc   Move forward to the nth occurrence of the character c.

       [n]Fc   Move backward to	the nth	occurrence of the character c.

       [n]tc   Move forward to just before the nth occurrence of the character
	       c.

       [n]Tc   Move  backward to just before the nth occurrence	of the charac-
	       ter c.

       [n];    Repeats the last	f, F, t	or T command.

       [n],    Repeats the last	f, F, t	or T command, but moves	in  the	 oppo-
	       site direction.

       Inter-line movement commands:

       [n]j, [n]+, and [n]^N
	       Move to the nth next line in the	history.

       [n]k, [n]-, and [n]^P
	       Move to the nth previous	line in	the history.

       [n]G    Move  to	line n in the history; if n is not specified, the num-
	       ber of the first	remembered line	is used.

       [n]g    Like G, except if n is not specified, it	goes to	the  most  re-
	       cent remembered line.

       [n]/string
	       Search backward through the history for the nth line containing
	       string;	if string starts with `^', the remainder of the	string
	       must appear at the start	of the history line for	it to match.

       [n]?string
	       Same as /, except it searches forward through the history.

       [n]n    Search for the nth occurrence of	the last  search  string;  the
	       direction of the	search is the same as the last search.

       [n]N    Search  for  the	 nth occurrence	of the last search string; the
	       direction of the	search is the opposite of the last search.

       ANSI-CurUp, PC-PgUp
	       Take the	characters from	the beginning of the line to the  cur-
	       rent  cursor position as	search string and do a history search,
	       backwards, for lines beginning with this	string;	keep the  cur-
	       sor  position.  This works only in insert mode and keeps	it en-
	       abled.

       ANSI-CurDown, PC-PgDn
	       Take the	characters from	the beginning of the line to the  cur-
	       rent  cursor position as	search string and do a history search,
	       forwards, for lines beginning with this string; keep the	cursor
	       position.  This works only in insert mode and keeps it enabled.

       Edit commands

       [n]a    Append text n times; goes into insert mode just after the  cur-
	       rent  position.	 The append is only replicated if command mode
	       is re-entered i.e. <Esc>	is used.

       [n]A    Same as a, except it appends at the end of the line.

       [n]i    Insert text n times; goes into insert mode at the current posi-
	       tion.  The insertion is only replicated if command mode is  re-
	       entered i.e. <Esc> is used.

       [n]I    Same  as	 i, except the insertion is done just before the first
	       non-blank character.

       [n]s    Substitute the next n characters	(i.e.  delete  the  characters
	       and go into insert mode).

       S       Substitute whole	line.  All characters from the first non-blank
	       character to the	end of the line	are deleted and	insert mode is
	       entered.

       [n]cmove-cmd
	       Change from the current position	to the position	resulting from
	       n  move-cmds  (i.e. delete the indicated	region and go into in-
	       sert mode); if move-cmd is c, the line starting from the	 first
	       non-blank character is changed.

       C       Change  from  the current position to the end of	the line (i.e.
	       delete to the end of the	line and go into insert	mode).

       [n]x    Delete the next n characters.

       [n]X    Delete the previous n characters.

       D       Delete to the end of the	line.

       [n]dmove-cmd
	       Delete from the current position	to the position	resulting from
	       n move-cmds; move-cmd is	a movement command (see	above)	or  d,
	       in which	case the current line is deleted.

       [n]rc   Replace the next	n characters with the character	c.

       [n]R    Replace.	  Enter	 insert	mode but overwrite existing characters
	       instead of inserting before existing characters.	 The  replace-
	       ment is repeated	n times.

       [n]~    Change the case of the next n characters.

       [n]ymove-cmd
	       Yank from the current position to the position resulting	from n
	       move-cmds  into	the  yank  buffer; if move-cmd is y, the whole
	       line is yanked.

       Y       Yank from the current position to the end of the	line.

       [n]p    Paste the contents of the yank buffer just  after  the  current
	       position, n times.

       [n]P    Same as p, except the buffer is pasted at the current position.

       Miscellaneous vi	commands

       ^J and ^M
	       The current line	is read, parsed	and executed by	the shell.

       ^L and ^R
	       Redraw the current line.

       [n].    Redo the	last edit command n times.

       u       Undo the	last edit command.

       U       Undo all	changes	that have been made to the current line.

       PC Home,	End, Del and cursor keys
	       They move as expected, both in insert and command mode.

       intr and	quit
	       The  interrupt  and  quit terminal characters cause the current
	       line to be removed to the  history  and	a  new	prompt	to  be
	       printed.

FILES
       ~/.mkshrc	  User	 mkshrc	 profile  (non-privileged  interactive
			  shells); see "Startup	files."	The  location  can  be
			  changed at compile time (e.g.	for embedded systems);
			  AOSP Android builds use /system/etc/mkshrc.
       ~/.profile	  User	profile	 (non-privileged  login	 shells);  see
			  "Startup files" near the top of this manual.
       /etc/profile	  System profile (login	shells); see "Startup files."
       /etc/shells	  Shell	database.
       /etc/suid_profile  Privileged shells'  profile  (sugid);	 see  "Startup
			  files."

       Note: On	Android, /system/etc/ contains the system and suid profile.

SEE ALSO
       awk(1),	cat(1),	 ed(1),	 getopt(1),  lksh(1),  sed(1), sh(1), stty(1),
       dup(2), execve(2), getgid(2), getuid(2),	mknod(2), mkfifo(2),  open(2),
       pipe(2),	 rename(2),  wait(2), getopt(3), nl_langinfo(3), setlocale(3),
       signal(3),  system(3),  tty(4),	 shells(5),   environ(7),   script(7),
       utf-8(7), mknod(8)

       The FAQ at http://www.mirbsd.org/mksh-faq.htm or	in the mksh.faq	file.

       http://www.mirbsd.org/ksh-chan.htm

       Morris Bolsky, The KornShell Command and	Programming Language, Prentice
       Hall    PTR,    xvi + 356    pages,    1989,   ISBN   978-0-13-516972-8
       (0-13-516972-0).

       Morris I. Bolsky	and David G.  Korn,  The  New  KornShell  Command  and
       Programming Language (2nd Edition), Prentice Hall PTR, xvi + 400	pages,
       1995, ISBN 978-0-13-182700-4 (0-13-182700-6).

       Stephen	G.  Kochan  and	Patrick	H. Wood, UNIX Shell Programming, Sams,
       3rd   Edition,	xiii + 437   pages,   2003,   ISBN   978-0-672-32490-1
       (0-672-32490-3).

       IEEE   Inc.,   IEEE   Standard  for  Information	 Technology - Portable
       Operating System	Interface (POSIX),  IEEE  Press,  Part	2:  Shell  and
       Utilities,    xvii + 1195    pages,    1993,   ISBN   978-1-55937-255-8
       (1-55937-255-9).

       Bill Rosenblatt,	Learning the Korn Shell, O'Reilly,  360	 pages,	 1993,
       ISBN 978-1-56592-054-5 (1-56592-054-6).

       Bill  Rosenblatt	 and  Arnold  Robbins, Learning	the Korn Shell,	Second
       Edition,	  O'Reilly,   432   pages,   2002,   ISBN    978-0-596-00195-7
       (0-596-00195-9).

       Barry   Rosenberg,   KornShell	Programming  Tutorial,	Addison-Wesley
       Professional,   xxi + 324   pages,   1991,    ISBN    978-0-201-56324-5
       (0-201-56324-X).

AUTHORS
       The  MirBSD Korn	Shell is developed by mirabilos	<m@mirbsd.org> as part
       of The MirOS Project.  This shell is based on  the  public  domain  7th
       edition Bourne shell clone by Charles Forsyth, who kindly agreed	to, in
       countries  where	the Public Domain status of the	work may not be	valid,
       grant a copyright licence to the	general	public to  deal	 in  the  work
       without	restriction and	permission to sublicence derivatives under the
       terms of	any (OSI approved) Open	Source licence,	and parts of  the  BRL
       shell  by Doug A. Gwyn, Doug Kingston, Ron Natalie, Arnold Robbins, Lou
       Salkind and others.  The	first release of pdksh	was  created  by  Eric
       Gisin,  and  it was subsequently	maintained by John R. MacMillan, Simon
       J. Gerraty and Michael Rendell.	The effort of several  projects,  such
       as  Debian  and OpenBSD,	and other contributors including our users, to
       improve the shell is appreciated.  See the documentation,  website  and
       source code (CVS) for details.

       mksh-os2	is developed by	KO Myung-Hun <komh@chollian.net>.

       mksh-w32	is developed by	Michael	Langguth <lan@scalaris.com>.

       mksh/z/OS is contributed	by Daniel Richard G. <skunk@iSKUNK.ORG>.

       The  BSD	 daemon	is Copyright (C) Marshall Kirk McKusick.  The complete
       legalese	is at: http://www.mirbsd.org/TaC-mksh.txt

CAVEATS
       mksh provides a consistent, clear interface normally.  This may deviate
       from POSIX in historic or opinionated places.  set -o posix (see	"POSIX
       mode" for details) will make the	shell more conformant,	but  mind  the
       FAQ  (see  "SEE	ALSO"),	 especially  regarding locales.	 mksh (but not
       lksh) provides a	consistent 32-bit integer  arithmetic  implementation,
       both signed and unsigned, with sign of the result of a remainder	opera-
       tion  and wraparound defined, even (defying POSIX) on 36-bit and	64-bit
       systems.

       mksh currently uses OPTU-16 internally, which is	the same as UTF-8  and
       CESU-8  with  0000..FFFD	 being valid codepoints; raw octets are	mapped
       into the	PUA range EF80..EFFF, which is assigned	by CSUR	for this  pur-
       pose.

BUGS
       Suspending  (using  ^Z)	pipelines like the one below will only suspend
       the currently running part of the pipeline; in this example, "fubar" is
       immediately printed on suspension (but not later	after an fg).

	     $ /bin/sleep 666 && echo fubar

       The truncation process involved when changing HISTFILE  does  not  free
       old  history  entries (leaks memory) and	leaks old entries into the new
       history if their	line numbers are not overwritten  by  same-number  en-
       tries  from the persistent history file;	truncating the on-disc file to
       HISTSIZE	lines has always been broken and prone to history file corrup-
       tion when multiple shells are accessing the file; the rollover  process
       for   the  in-memory  portion  of  the  history	is  slow,  should  use
       memmove(3).

       This document attempts to describe mksh R59c and	up,  compiled  without
       any  options  impacting	functionality,	such  as  MKSH_SMALL, when not
       called as /bin/sh which,	on some	systems	only, enables set -o posix  or
       set  -o	sh automatically (whose	behaviour differs across targets), for
       an operating environment	supporting all of its advanced needs.

       Please report bugs in mksh to the public	development  mailing  list  at
       <miros-mksh@mirbsd.org>	 (please  note	the  EU-DSGVO/GDPR  notice  on
       http://www.mirbsd.org/rss.htm#lists and in the SMTP banner!) or in  the
       #!/bin/mksh  (or	 #ksh) IRC channel at irc.freenode.net (Port 6697 SSL,
       6667 unencrypted), or at: https://launchpad.net/mksh

MirBSD				October	1, 2020			       MKSH(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=mksh&sektion=1&manpath=FreeBSD+Ports+14.3.quarterly>

home | help