| .\" $MirOS: src/bin/mksh/mksh.1,v 1.494 2020/10/01 22:39:57 tg Exp $ |
| .\" $OpenBSD: ksh.1,v 1.160 2015/07/04 13:27:04 feinerer Exp $ |
| .\"- |
| .\" Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, |
| .\" 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, |
| .\" 2018, 2019, 2020 |
| .\" mirabilos <[email protected]> |
| .\" |
| .\" Provided that these terms and disclaimer and all copyright notices |
| .\" are retained or reproduced in an accompanying document, permission |
| .\" is granted to deal in this work without restriction, including un‐ |
| .\" limited rights to use, publicly perform, distribute, sell, modify, |
| .\" merge, give away, or sublicence. |
| .\" |
| .\" This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to |
| .\" the utmost extent permitted by applicable law, neither express nor |
| .\" implied; without malicious intent or gross negligence. In no event |
| .\" may a licensor, author or contributor be held liable for indirect, |
| .\" direct, other damage, loss, or other issues arising in any way out |
| .\" of dealing in the work, even if advised of the possibility of such |
| .\" damage or existence of a defect, except proven that it results out |
| .\" of said person’s immediate fault when using the work as intended. |
| .\"- |
| .\" Try to make GNU groff and AT&T nroff more compatible |
| .\" * ` generates ‘ in gnroff, so use \` |
| .\" * ' generates ’ in gnroff, \' generates ´, so use \*(aq |
| .\" * - generates ‐ in gnroff, \- generates −, so .tr it to - |
| .\" thus use - for hyphens and \- for minus signs and option dashes |
| .\" * ~ is size-reduced and placed atop in groff, so use \*(TI |
| .\" * ^ is size-reduced and placed atop in groff, so use \*(ha |
| .\" * \(en does not work in nroff, so use \*(en for a solo en dash |
| .\" * and \*(EM for a correctly spaced em dash |
| .\" * <>| are problematic, so redefine and use \*(Lt\*(Gt\*(Ba |
| .\" Also make sure to use \& *before* a punctuation char that is to not |
| .\" be interpreted as punctuation, and especially with two-letter words |
| .\" but also (after) a period that does not end a sentence (“e.g.\&”). |
| .\" The section after the "doc" macropackage has been loaded contains |
| .\" additional code to convene between the UCB mdoc macropackage (and |
| .\" its variant as BSD mdoc in groff) and the GNU mdoc macropackage. |
| .\" |
| .ie \n(.g \{\ |
| . if \*[.T]ascii .tr \-\N'45' |
| . if \*[.T]latin1 .tr \-\N'45' |
| . if \*[.T]utf8 .tr \-\N'45' |
| . ds <= \[<=] |
| . ds >= \[>=] |
| . ds Rq \[rq] |
| . ds Lq \[lq] |
| . ds sL \(aq |
| . ds sR \(aq |
| . if \*[.T]utf8 .ds sL ` |
| . if \*[.T]ps .ds sL ` |
| . if \*[.T]utf8 .ds sR ' |
| . if \*[.T]ps .ds sR ' |
| . ds aq \(aq |
| . ds TI \(ti |
| . ds ha \(ha |
| . ds en \(en |
| .\} |
| .el \{\ |
| . ds aq ' |
| . ds TI ~ |
| . ds ha ^ |
| . ds en \(em |
| .\} |
| .ie n \{\ |
| . ds EM \ \*(en\ \& |
| .\} |
| .el \{\ |
| . ds EM \f(TR\^\(em\^\fP |
| .\} |
| .\" |
| .\" Implement .Dd with the Mdocdate RCS keyword |
| .\" |
| .rn Dd xD |
| .de Dd |
| .ie \\$1$Mdocdate: \{\ |
| . xD \\$2 \\$3, \\$4 |
| .\} |
| .el .xD \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 |
| .. |
| .\" |
| .\" .Dd must come before definition of .Mx, because when called |
| .\" with -mandoc, it might implement .Mx itself, but we want to |
| .\" use our own definition. And .Dd must come *first*, always. |
| .\" |
| .Dd $Mdocdate: October 1 2020 $ |
| .\" |
| .\" Check which macro package we use, and do other -mdoc setup. |
| .\" |
| .ie \n(.g \{\ |
| . if \*[.T]utf8 .tr \[la]\*(Lt |
| . if \*[.T]utf8 .tr \[ra]\*(Gt |
| . ie d volume-ds-1 .ds tT gnu |
| . el .ie d doc-volume-ds-1 .ds tT gnp |
| . el .ds tT bsd |
| .\} |
| .el .ds tT ucb |
| .\" |
| .\" Implement .Mx (MirBSD) |
| .\" |
| .ie "\*(tT"gnu" \{\ |
| . eo |
| . de Mx |
| . nr curr-font \n[.f] |
| . nr curr-size \n[.ps] |
| . ds str-Mx \f[\n[curr-font]]\s[\n[curr-size]u] |
| . ds str-Mx1 \*[Tn-font-size]\%MirBSD\*[str-Mx] |
| . if !\n[arg-limit] \ |
| . if \n[.$] \{\ |
| . ds macro-name Mx |
| . parse-args \$@ |
| . \} |
| . if (\n[arg-limit] > \n[arg-ptr]) \{\ |
| . nr arg-ptr +1 |
| . ie (\n[type\n[arg-ptr]] == 2) \ |
| . as str-Mx1 \~\*[arg\n[arg-ptr]] |
| . el \ |
| . nr arg-ptr -1 |
| . \} |
| . ds arg\n[arg-ptr] "\*[str-Mx1] |
| . nr type\n[arg-ptr] 2 |
| . ds space\n[arg-ptr] "\*[space] |
| . nr num-args (\n[arg-limit] - \n[arg-ptr]) |
| . nr arg-limit \n[arg-ptr] |
| . if \n[num-args] \ |
| . parse-space-vector |
| . print-recursive |
| .. |
| . ec |
| . ds sP \s0 |
| . ds tN \*[Tn-font-size] |
| .\} |
| .el .ie "\*(tT"gnp" \{\ |
| . eo |
| . de Mx |
| . nr doc-curr-font \n[.f] |
| . nr doc-curr-size \n[.ps] |
| . ds doc-str-Mx \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u] |
| . ds doc-str-Mx1 \*[doc-Tn-font-size]\%MirBSD\*[doc-str-Mx] |
| . if !\n[doc-arg-limit] \ |
| . if \n[.$] \{\ |
| . ds doc-macro-name Mx |
| . doc-parse-args \$@ |
| . \} |
| . if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\ |
| . nr doc-arg-ptr +1 |
| . ie (\n[doc-type\n[doc-arg-ptr]] == 2) \ |
| . as doc-str-Mx1 \~\*[doc-arg\n[doc-arg-ptr]] |
| . el \ |
| . nr doc-arg-ptr -1 |
| . \} |
| . ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Mx1] |
| . nr doc-type\n[doc-arg-ptr] 2 |
| . ds doc-space\n[doc-arg-ptr] "\*[doc-space] |
| . nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr]) |
| . nr doc-arg-limit \n[doc-arg-ptr] |
| . if \n[doc-num-args] \ |
| . doc-parse-space-vector |
| . doc-print-recursive |
| .. |
| . ec |
| . ds sP \s0 |
| . ds tN \*[doc-Tn-font-size] |
| .\} |
| .el \{\ |
| . de Mx |
| . nr cF \\n(.f |
| . nr cZ \\n(.s |
| . ds aa \&\f\\n(cF\s\\n(cZ |
| . if \\n(aC==0 \{\ |
| . ie \\n(.$==0 \&MirBSD\\*(aa |
| . el .aV \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 |
| . \} |
| . if \\n(aC>\\n(aP \{\ |
| . nr aP \\n(aP+1 |
| . ie \\n(C\\n(aP==2 \{\ |
| . as b1 \&MirBSD\ #\&\\*(A\\n(aP\\*(aa |
| . ie \\n(aC>\\n(aP \{\ |
| . nr aP \\n(aP+1 |
| . nR |
| . \} |
| . el .aZ |
| . \} |
| . el \{\ |
| . as b1 \&MirBSD\\*(aa |
| . nR |
| . \} |
| . \} |
| .. |
| .\} |
| .\"- |
| .Dt MKSH 1 |
| .Os MirBSD |
| .Sh NAME |
| .Nm mksh , |
| .Nm sh |
| .Nd MirBSD Korn shell |
| .Sh SYNOPSIS |
| .Nm |
| .Bk -words |
| .Op Fl +abCefhiklmnprUuvXx |
| .Oo |
| .Fl T Oo Ar \&! Oc Ns Ar tty |
| \*(Ba |
| .Ar \&\- |
| .Oc |
| .Op Fl +o Ar option |
| .Oo |
| .Fl c Ar string \*(Ba |
| .Fl s \*(Ba |
| .Ar file |
| .Op Ar argument ... |
| .Oc |
| .Ek |
| .Nm builtin-name |
| .Op Ar argument ... |
| .Sh DESCRIPTION |
| .Nm |
| is a command interpreter intended for both interactive and shell |
| script use. |
| Its command language is a superset of the |
| .Xr sh C |
| shell language 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 information is first and foremost presented with |
| .Nm |
| in mind and should be taken as such. |
| .Ss I use Android, OS/2, etc. so what...? |
| Please refer to: |
| .Pa http://www.mirbsd.org/mksh\-faq.htm#sowhatismksh |
| .Ss 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. |
| .Pp |
| The options are as follows: |
| .Bl -tag -width XcXstring |
| .It Fl c Ar string |
| .Nm |
| will execute the command(s) contained in |
| .Ar string . |
| .It Fl i |
| Interactive shell. |
| A shell that reads commands from standard input is |
| .Dq interactive |
| if this |
| option is used or if both standard input and standard error are attached |
| to a |
| .Xr tty 4 . |
| An interactive shell has job control enabled, ignores the |
| .Dv SIGINT , |
| .Dv SIGQUIT |
| and |
| .Dv SIGTERM |
| signals, and prints prompts before reading input (see the |
| .Ev PS1 |
| and |
| .Ev PS2 |
| parameters). |
| It also processes the |
| .Ev ENV |
| parameter or the |
| .Pa mkshrc |
| file (see below). |
| For non-interactive shells, the |
| .Ic trackall |
| option is on by default (see the |
| .Ic set |
| command below). |
| .It Fl l |
| Login shell. |
| If the name or basename the shell is called with (i.e. argv[0]) |
| starts with |
| .Ql \- |
| or if this option is used, |
| the shell is assumed to be a login shell; see |
| .Sx Startup files |
| below. |
| .It Fl p |
| Privileged shell. |
| A shell is |
| .Dq privileged |
| if the real user ID or group ID does not match the |
| effective user ID or group ID (see |
| .Xr getuid 2 |
| and |
| .Xr 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 implications, see |
| .Sx Startup files . |
| If the shell is privileged and this flag is not explicitly set, the |
| .Dq privileged |
| option is cleared automatically after processing the startup files. |
| .It Fl r |
| Restricted shell. |
| A shell is |
| .Dq restricted |
| if the basename the shell is called with, after |
| .Ql \- |
| processing, starts with |
| .Ql r |
| or if this option is used. |
| The following restrictions come into effect after the shell processes any |
| profile and |
| .Ev ENV |
| files: |
| .Pp |
| .Bl -bullet -compact |
| .It |
| The |
| .Ic cd |
| .Po and Ic chdir Pc |
| command is disabled. |
| .It |
| The |
| .Ev SHELL , |
| .Ev ENV |
| and |
| .Ev PATH |
| parameters cannot be changed. |
| .It |
| Command names can't be specified with absolute or relative paths. |
| .It |
| The |
| .Fl p |
| option of the built-in command |
| .Ic command |
| can't be used. |
| .It |
| Redirections that create files can't be used (i.e.\& |
| .Dq Li \*(Gt , |
| .Dq Li \*(Gt\*(Ba , |
| .Dq Li \*(Gt\*(Gt , |
| .Dq Li \*(Lt\*(Gt ) . |
| .El |
| .It Fl s |
| The shell reads commands from standard input; all non-option arguments |
| are positional parameters. |
| .It Fl T Ar name |
| Spawn |
| .Nm |
| on the |
| .Xr tty 4 |
| device given. |
| The paths |
| .Ar name , |
| .Pa /dev/ttyC Ns Ar name |
| and |
| .Pa /dev/tty Ns Ar name |
| are attempted in order. |
| Unless |
| .Ar name |
| begins with an exclamation mark |
| .Pq Ql \&! , |
| this is done in a subshell and returns immediately. |
| If |
| .Ar name |
| is a dash |
| .Pq Ql \&\- , |
| detach from controlling terminal (daemonise) instead. |
| .El |
| .Pp |
| In addition to the above, the options described in the |
| .Ic set |
| built-in command can also be used on the command line: |
| both |
| .Op Fl +abCefhkmnuvXx |
| and |
| .Op Fl +o Ar option |
| can be used for single letter or long options, respectively. |
| .Pp |
| If neither the |
| .Fl c |
| nor the |
| .Fl 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 determined as follows: if the |
| .Fl 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. |
| .Pp |
| 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 error |
| 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. |
| .Ss Startup files |
| For the actual location of these files, see |
| .Sx 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 profile next. |
| A non-privileged interactive shell checks the value of the |
| .Ev ENV |
| parameter after subjecting it to parameter, command, arithmetic and tilde |
| .Pq Ql \*(TI |
| 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 privileged shell then drops privileges if neither was the |
| .Fl p |
| option given on the command line nor set during execution of the startup files. |
| .Ss Command syntax |
| The shell begins parsing its input by removing any backslash-newline |
| combinations, then breaking it into |
| .Em words . |
| Words (which are sequences of characters) are delimited by unquoted whitespace |
| characters (space, tab and newline) or meta-characters |
| .Po |
| .Ql \*(Lt , |
| .Ql \*(Gt , |
| .Ql \*(Ba , |
| .Ql \&; , |
| .Ql \&( , |
| .Ql \&) |
| and |
| .Ql & |
| .Pc . |
| Aside from delimiting words, spaces and tabs are ignored, while newlines |
| usually delimit commands. |
| The meta-characters are used in building the following |
| .Em tokens : |
| .Dq Li \*(Lt , |
| .Dq Li \*(Lt& , |
| .Dq Li \*(Lt\*(Lt , |
| .Dq Li \*(Lt\*(Lt\*(Lt , |
| .Dq Li \*(Gt , |
| .Dq Li \*(Gt& , |
| .Dq Li \*(Gt\*(Gt , |
| .Dq Li &\*(Gt , |
| etc. are used to specify redirections (see |
| .Sx Input/output redirection |
| below); |
| .Dq Li \*(Ba |
| is used to create pipelines; |
| .Dq Li \*(Ba& |
| is used to create co-processes (see |
| .Sx Co-processes |
| below); |
| .Dq Li \&; |
| is used to separate commands; |
| .Dq Li & |
| is used to create asynchronous pipelines; |
| .Dq Li && |
| and |
| .Dq Li \*(Ba\*(Ba |
| are used to specify conditional execution; |
| .Dq Li \&;; , |
| .Dq Li \&;& |
| and |
| .Dq Li \&;\*(Ba |
| are used in |
| .Ic case |
| statements; |
| .Dq Li \&(( ... \&)) |
| is used in arithmetic expressions; |
| and lastly, |
| .Dq Li \&( ... \&) |
| is used to create subshells. |
| .Pp |
| Whitespace and meta-characters can be quoted individually using a backslash |
| .Pq Ql \e , |
| or in groups using double |
| .Pq Ql \&" |
| or single |
| .Pq Dq Li \*(aq |
| quotes. |
| Note that the following characters are also treated specially by the |
| shell and must be quoted if they are to represent themselves: |
| .Ql \e , |
| .Ql \&" , |
| .Dq Li \*(aq , |
| .Ql # , |
| .Ql $ , |
| .Ql \` , |
| .Ql \*(TI , |
| .Ql { , |
| .Ql } , |
| .Ql * , |
| .Ql \&? |
| and |
| .Ql \&[ . |
| The first three of these are the above mentioned quoting characters (see |
| .Sx Quoting |
| below); |
| .Ql # , |
| if used at the beginning of a word, |
| introduces a comment\*(EMeverything after the |
| .Ql # |
| up to the nearest newline is ignored; |
| .Ql $ |
| is used to introduce parameter, command and arithmetic substitutions (see |
| .Sx Substitution |
| below); |
| .Ql \` |
| introduces an old-style command substitution (see |
| .Sx Substitution |
| below); |
| .Ql \*(TI |
| begins a directory expansion (see |
| .Sx Tilde expansion |
| below); |
| .Ql { |
| and |
| .Ql } |
| delimit |
| .Xr csh 1 Ns -style |
| alternations (see |
| .Sx Brace expansion |
| below); |
| and finally, |
| .Ql * , |
| .Ql \&? |
| and |
| .Ql \&[ |
| are used in file name generation (see |
| .Sx File name patterns |
| below). |
| .Pp |
| As words and tokens are parsed, the shell builds commands, of which there |
| are two basic types: |
| .Em simple-commands , |
| typically programmes that are executed, and |
| .Em compound-commands , |
| such as |
| .Ic for |
| and |
| .Ic if |
| statements, grouping constructs and function definitions. |
| .Pp |
| A simple-command consists of some combination of parameter assignments |
| (see |
| .Sx Parameters |
| below), |
| input/output redirections (see |
| .Sx 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 arguments. |
| 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 |
| .Ev PATH |
| parameter; see |
| .Sx Command execution |
| below). |
| Note that all command constructs have an exit status: for external commands, |
| this is related to the status returned by |
| .Xr 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. |
| .Pp |
| Commands can be chained together using the |
| .Dq Li \*(Ba |
| token to form pipelines, in which the standard output of each command but the |
| last is piped (see |
| .Xr pipe 2 ) |
| to the standard input of the following command. |
| The exit status of a pipeline is that of its last command, unless the |
| .Ic pipefail |
| option 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 |
| .Nm ksh , |
| where all but the last command were executed in subshells; see the |
| .Ic read |
| builtin's description for implications and workarounds. |
| A pipeline may be prefixed by the |
| .Dq Li \&! |
| 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. |
| .Pp |
| .Em Lists |
| of commands can be created by separating pipelines by any of the following |
| tokens: |
| .Dq Li && , |
| .Dq Li \*(Ba\*(Ba , |
| .Dq Li & , |
| .Dq Li \*(Ba& |
| and |
| .Dq Li \&; . |
| The first two are for conditional execution: |
| .Dq Ar cmd1 No && Ar cmd2 |
| executes |
| .Ar cmd2 |
| only if the exit status of |
| .Ar cmd1 |
| is zero; |
| .Dq Li \*(Ba\*(Ba |
| .No is the opposite\*(EM Ns Ar cmd2 |
| is executed only if the exit status of |
| .Ar cmd1 |
| is non-zero. |
| .Dq Li && |
| and |
| .Dq Li \*(Ba\*(Ba |
| have equal precedence which is higher than that of |
| .Dq Li & , |
| .Dq Li \*(Ba& |
| and |
| .Dq Li \&; , |
| which also have equal precedence. |
| Note that the |
| .Dq Li && |
| and |
| .Dq Li \*(Ba\*(Ba |
| operators are |
| .Qq left-associative . |
| For example, both of these commands will print only |
| .Qq bar : |
| .Bd -literal -offset indent |
| $ false && echo foo \*(Ba\*(Ba echo bar |
| $ true \*(Ba\*(Ba echo foo && echo bar |
| .Ed |
| .Pp |
| The |
| .Dq Li & |
| token causes the preceding command to be executed asynchronously; 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 |
| .Sx Job control |
| below). |
| When an asynchronous command is started when job control is disabled |
| (i.e. in most scripts), the command is started with signals |
| .Dv SIGINT |
| and |
| .Dv SIGQUIT |
| ignored and with input redirected from |
| .Pa /dev/null |
| (however, redirections specified in the asynchronous command have precedence). |
| The |
| .Dq Li \*(Ba& |
| operator starts a co-process which is a special kind of asynchronous process |
| (see |
| .Sx Co-processes |
| below). |
| Note that a command must follow the |
| .Dq Li && |
| and |
| .Dq Li \*(Ba\*(Ba |
| operators, while it need not follow |
| .Dq Li & , |
| .Dq Li \*(Ba& |
| or |
| .Dq Li \&; . |
| The exit status of a list is that of the last command executed, with the |
| exception of asynchronous lists, for which the exit status is 0. |
| .Pp |
| 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 parameter assignments or |
| redirections): |
| .Bd -literal -offset indent |
| case else function then ! ( |
| do esac if time [[ (( |
| done fi in until { |
| elif for select while } |
| .Ed |
| .Pp |
| In the following compound command descriptions, command lists (denoted as |
| .Em 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: |
| .Bd -literal -offset indent |
| $ { echo foo; echo bar; } |
| $ { echo foo; echo bar\*(Ltnewline\*(Gt} |
| $ { { echo foo; echo bar; } } |
| .Ed |
| .Pp |
| This is not valid: |
| .Pp |
| .Dl $ { echo foo; echo bar } |
| .Bl -tag -width 4n |
| .It Xo Ic case Ar word Ic in |
| .Oo Op \&( |
| .Ar pattern |
| .Op \*(Ba Ar pattern |
| .No ... Ns ) |
| .Ar list |
| .Aq terminator |
| .Oc No ... Ic esac |
| .Xc |
| The |
| .Ic case |
| statement attempts to match |
| .Ar word |
| against a specified |
| .Ar pattern ; |
| the |
| .Ar list |
| associated with the first successfully matched pattern is executed. |
| Patterns used in |
| .Ic case |
| statements are the same as those used for file name patterns except that the |
| restrictions regarding |
| .Ql \&. |
| and |
| .Ql / |
| are dropped. |
| Note that any unquoted 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. |
| .Pp |
| For historical reasons, open and close braces may be used instead of |
| .Ic in |
| and |
| .Ic esac , |
| for example: |
| .Dq Li case $foo { (ba[rz]\*(Bablah) date ;; } |
| .Pp |
| The list |
| .Ao terminator Ac Ns s |
| are: |
| .Bl -tag -width 4n |
| .It Dq Li ;; |
| Terminate after the list. |
| .It Dq Li \&;& |
| Fall through into the next list. |
| .It Dq Li \&;\*(Ba |
| Evaluate the remaining pattern-list tuples. |
| .El |
| .Pp |
| The exit status of a |
| .Ic case |
| statement is that of the executed |
| .Ar list ; |
| if no |
| .Ar list |
| is executed, the exit status is zero. |
| .It Xo Ic for Ar name |
| .Oo Ic in Ar word ... Oc Ic ; |
| .Ic do Ar list ; Ic done |
| .Xc |
| For each |
| .Ar word |
| in the specified word list, the parameter |
| .Ar name |
| is set to the word and |
| .Ar list |
| is executed. |
| The exit status of a |
| .Ic for |
| statement is the last exit status of |
| .Ar list ; |
| if |
| .Ar list |
| is never executed, the exit status is zero. |
| If |
| .Ic in |
| is not used to specify a word list, the positional parameters ($1, $2, |
| etc.) are used instead; in this case, use a newline instead of the semicolon |
| .Pq Sq Ic ;\& |
| for portability. |
| For historical reasons, open and close braces may be used instead of |
| .Ic do |
| and |
| .Ic done , |
| as in |
| .Dq Li for i; { echo $i; } |
| .Pq not portable . |
| .It Xo Ic function Ar name |
| .No { Ar list ; No } |
| .Xc |
| Defines the function |
| .Ar name |
| (see |
| .Sx Functions |
| below). |
| All redirections specified after a function definition are performed whenever |
| the function is executed, not when the function definition is executed. |
| .It Ar name Ns \&() Ar command |
| Mostly the same as |
| .Ic function |
| (see above and |
| .Sx Functions |
| below). |
| Most amounts of space and tab after |
| .Ar name |
| will be ignored. |
| .It Xo Ic function Ar name Ns \&() |
| .No { Ar list ; No } |
| .Xc |
| .Nm bash Ns ism for |
| .Ar name Ns Li ()\ { |
| .Ar list Ns Li ;\ } |
| .Pq the Ic function No keyword is ignored . |
| .It Xo Ic if Ar list ; |
| .Ic then Ar list ; |
| .Oo Ic elif Ar list ; |
| .Ic then Ar list ; Oc |
| .No ... |
| .Oo Ic else Ar list ; Oc |
| .Ic fi |
| .Xc |
| If the exit status of the first |
| .Ar list |
| is zero, the second |
| .Ar list |
| is executed; otherwise, the |
| .Ar list |
| following the |
| .Ic elif , |
| if any, is executed with similar consequences. |
| If all the lists following the |
| .Ic if |
| and |
| .Ic elif Ns s |
| fail (i.e. exit with non-zero status), the |
| .Ar list |
| following the |
| .Ic else |
| is executed. |
| The exit status of an |
| .Ic if |
| statement is that of whatever non-conditional |
| .Pq not the first |
| .Ar list |
| that is executed; if no non-conditional |
| .Ar list |
| is executed, the exit status is zero. |
| .It Xo Ic select Ar name |
| .Oo Ic in Ar word No ... Oc ; |
| .Ic do Ar list ; Ic done |
| .Xc |
| The |
| .Ic select |
| statement provides an automatic method of presenting the user with a menu and |
| selecting from it. |
| An enumerated list of the specified |
| .Ar word Ns s |
| is printed on standard error, followed by a prompt |
| .Po |
| .Ev PS3 : |
| normally |
| .Dq Li #?\ \& |
| .Pc . |
| A number corresponding to one of the enumerated words is then read from |
| standard input, |
| .Ar name |
| is set to the selected word (or unset if the selection is not valid), |
| .Ev REPLY |
| is set to what was read (leading and trailing space is stripped), and |
| .Ar list |
| is executed. |
| If a blank line (i.e. zero or more |
| .Ev IFS |
| octets) is entered, the menu is reprinted without executing |
| .Ar list . |
| .Pp |
| When |
| .Ar list |
| completes, the enumerated list is printed if |
| .Ev 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 |
| .Ic break |
| statement is executed inside the loop. |
| The exit status of a |
| .Ic select |
| statement is zero if a |
| .Ic break |
| statement is used to exit the loop, non-zero otherwise. |
| If |
| .Dq Ic in Ar word ... |
| is omitted, the positional parameters are used. |
| For historical reasons, open and close braces may be used instead of |
| .Ic do |
| and |
| .Ic done , |
| as in: |
| .Dq Li select i; { echo $i; } |
| .It Xo Ic time Op Fl p |
| .Op Ar pipeline |
| .Xc |
| The |
| .Sx Command execution |
| section describes the |
| .Ic time |
| reserved word. |
| .It Xo Ic until Ar list ; |
| .Ic do Ar list ; Ic done |
| .Xc |
| This works like |
| .Ic while Pq see below , |
| except that the body |
| .Ar list |
| is executed only while the exit status of the first |
| .Ar list |
| is non-zero. |
| .It Xo Ic while Ar list ; |
| .Ic do Ar list ; Ic done |
| .Xc |
| A |
| .Ic while |
| is a pre-checked loop. |
| Its body |
| .Ar list |
| is executed as often as the exit status of the first |
| .Ar list |
| is zero. |
| The exit status of a |
| .Ic while |
| statement is the last exit status of the |
| .Ar list |
| in the body of the loop; if the body is not executed, the exit status is zero. |
| .It Bq Bq Ar \ \&expression\ \& |
| Similar to the |
| .Ic test |
| and |
| .Ic \&[ ... \&] |
| commands (described later), with the following exceptions: |
| .Bl -bullet |
| .It |
| Field splitting and globbing are not performed on arguments. |
| .It |
| The |
| .Fl a |
| .Pq AND |
| and |
| .Fl o |
| .Pq OR |
| operators are replaced, respectively, with |
| .Dq Ic && |
| and |
| .Dq Ic \*(Ba\*(Ba . |
| .It |
| Operators (e.g.\& |
| .Dq Ic \-f , |
| .Dq Ic = , |
| .Dq Ic \&! ) |
| must be unquoted. |
| .It |
| Parameter, command and arithmetic substitutions are performed as expressions |
| are evaluated and lazy expression evaluation is used for the |
| .Dq Ic && |
| and |
| .Dq Ic \*(Ba\*(Ba |
| operators. |
| This means that in the following statement, |
| .Ic $(\*(Ltfoo) |
| is evaluated if and only if the file |
| .Pa foo |
| exists and is readable: |
| .Bd -literal -offset indent |
| $ [[ \-r foo && $(\*(Ltfoo) = b*r ]] |
| .Ed |
| .It |
| The second operand of the |
| .Dq Ic = |
| and |
| .Dq Ic != |
| expressions is a pattern (e.g. the comparison |
| .Ic \&[[ foobar = f*r ]] |
| succeeds). |
| This even works indirectly, while quoting forces literal interpretation: |
| .Bd -literal -offset indent |
| $ bar=foobar; baz=\*(aqf*r\*(aq # or: baz=\*(aqf+(o)b?r\*(aq |
| $ [[ $bar = $baz ]]; echo $? # 0 |
| $ [[ $bar = \&"$baz" ]]; echo $? # 1 |
| .Ed |
| .El |
| .It { Ar list ; No } |
| Compound construct; |
| .Ar list |
| is executed, but not in a subshell. |
| .br |
| Note that |
| .Dq Li { |
| and |
| .Dq Li } |
| are reserved words, not meta-characters. |
| .It Pq Ar list |
| Execute |
| .Ar list |
| in a subshell, forking. |
| There is no implicit way to pass environment changes from a |
| subshell back to its parent. |
| .It \&(( Ar expression No )) |
| The arithmetic expression |
| .Ar expression |
| is evaluated; equivalent to |
| .Sq Li let \&" Ns Ar expression Ns \&" |
| in a compound construct. |
| .br |
| See the |
| .Ic let |
| command and |
| .Sx Arithmetic expressions |
| below. |
| .El |
| .Ss Quoting |
| Quoting is used to prevent the shell from treating characters or words |
| specially. |
| There are three methods of quoting. |
| First, |
| .Ql \e |
| quotes the following character, unless it is at the end of a line, in which |
| case both the |
| .Ql \e |
| and the newline are stripped. |
| Second, a single quote |
| .Pq Dq Li \*(aq |
| quotes everything up to the next single quote (this may span lines). |
| Third, a double quote |
| .Pq Ql \&" |
| quotes all characters, except |
| .Ql $ , |
| .Ql \e |
| and |
| .Ql \` , |
| up to the next unescaped double quote. |
| .Ql $ |
| and |
| .Ql \` |
| 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 command |
| substitution has backslash-quoting for double quotes enabled. |
| If a |
| .Ql \e |
| inside a double-quoted string is followed by |
| .Ql \&" , |
| .Ql $ , |
| .Ql \e |
| or |
| .Ql \` , |
| only the |
| .Ql \e |
| is removed, i.e. the combination is replaced by the second character; |
| if it is followed by a newline, both the |
| .Ql \e |
| and the newline are stripped; otherwise, both the |
| .Ql \e |
| and the character following are unchanged. |
| .Pp |
| If a single-quoted string is preceded by an unquoted |
| .Ql $ , |
| C style backslash expansion (see below) is applied (even single quote |
| characters inside can be escaped and do not terminate the string then); |
| the expanded result is treated as any other single-quoted string. |
| If a double-quoted string is preceded by an unquoted |
| .Ql $ , |
| the |
| .Ql $ |
| is simply ignored. |
| .Ss Backslash expansion |
| In places where backslashes are expanded, certain C and |
| .At |
| .Nm ksh |
| or GNU |
| .Nm bash |
| style escapes are translated. |
| These include |
| .Dq Li \ea , |
| .Dq Li \eb , |
| .Dq Li \ef , |
| .Dq Li \en , |
| .Dq Li \er , |
| .Dq Li \et , |
| .Dq Li \eU######## , |
| .Dq Li \eu#### |
| and |
| .Dq Li \ev . |
| For |
| .Dq Li \eU######## |
| and |
| .Dq Li \eu#### , |
| .Sq Li # |
| means a hexadecimal digit (up to 4 or 8); these translate a |
| Universal Coded Character Set codepoint to UTF-8 (see |
| .Sx CAVEATS |
| on UCS limitations). |
| Furthermore, |
| .Dq Li \eE |
| and |
| .Dq Li \ee |
| expand to the escape character. |
| .Pp |
| In the |
| .Ic print |
| builtin mode, |
| octal sequences must have the optional up to three octal digits |
| .Sq Li # |
| prefixed with the digit zero |
| .Pq Dq Li \e0### ; |
| hexadecimal sequences |
| .Dq Li \ex## |
| are limited to up to two hexadecimal digits |
| .Sq Li # ; |
| both octal and hexadecimal sequences convert to raw octets; |
| .Dq Li \e% , |
| where |
| .Sq Li % |
| is none of the above, translates to |
| .Li \e% |
| .Pq backslashes are retained . |
| .Pp |
| In C style mode, raw octet-yielding octal sequences |
| .Dq Li \e### |
| must not have the one up to three octal digits prefixed with the |
| digit zero; hexadecimal sequences |
| .Dq Li \ex## |
| greedily eat up as many hexadecimal digits |
| .Sq Li # |
| as they can and terminate with the first non-xdigit; below |
| .Li \ex100 |
| these produce raw octets; above, they are equivalent to |
| .Dq Li \eU# . |
| The sequence |
| .Dq Li \ec% , |
| where |
| .Sq Li % |
| is any octet, translates to |
| .Ic Ctrl- Ns Li % , |
| that is, |
| .Dq Li \ec? |
| becomes DEL, everything else is bitwise ANDed with 0x9F. |
| .Dq Li \e% , |
| where |
| .Sq Li % |
| is none of the above, translates to |
| .Li % : |
| backslashes are trimmed even before newlines. |
| .Ss 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. substitutes 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. |
| .Pp |
| The following command aliases are defined automatically by the shell: |
| .Bd -literal -offset indent |
| autoload=\*(aq\e\ebuiltin typeset \-fu\*(aq |
| functions=\*(aq\e\ebuiltin typeset \-f\*(aq |
| hash=\*(aq\e\ebuiltin alias \-t\*(aq |
| history=\*(aq\e\ebuiltin fc \-l\*(aq |
| integer=\*(aq\e\ebuiltin typeset \-i\*(aq |
| local=\*(aq\e\ebuiltin typeset\*(aq |
| login=\*(aq\e\ebuiltin exec login\*(aq |
| nameref=\*(aq\e\ebuiltin typeset \-n\*(aq |
| nohup=\*(aqnohup \*(aq |
| r=\*(aq\e\ebuiltin fc \-e \-\*(aq |
| type=\*(aq\e\ebuiltin whence \-v\*(aq |
| .Ed |
| .Pp |
| 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 command. |
| 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 |
| .Ic alias Fl t . |
| Note that changing the |
| .Ev PATH |
| parameter clears the saved paths for all tracked aliases. |
| If the |
| .Ic trackall |
| option is set (i.e.\& |
| .Ic set Fl o Ic trackall |
| or |
| .Ic set Fl 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: |
| .Xr cat 1 , |
| .Xr cc 1 , |
| .Xr chmod 1 , |
| .Xr cp 1 , |
| .Xr date 1 , |
| .Xr ed 1 , |
| .Xr emacs 1 , |
| .Xr grep 1 , |
| .Xr ls 1 , |
| .Xr make 1 , |
| .Xr mv 1 , |
| .Xr pr 1 , |
| .Xr rm 1 , |
| .Xr sed 1 , |
| .Xr sh 1 , |
| .Xr vi 1 |
| and |
| .Xr who 1 . |
| .Ss Substitution |
| The first step the shell takes in executing a simple-command is to perform |
| substitutions on the words of the command. |
| There are three kinds of |
| substitution: parameter, command and arithmetic. |
| Parameter substitutions, |
| which are described in detail in the next section, take the form |
| .Pf $ Ns Ar name |
| or |
| .Pf ${ Ns Ar ... Ns } ; |
| command substitutions take the form |
| .Pf $( Ns Ar command Ns \&) |
| or (deprecated) |
| .Pf \` Ns Ar command Ns \` |
| or (executed in the current environment) |
| .Pf ${\ \& Ar command Ns \&;} |
| and strip trailing newlines; |
| and arithmetic substitutions take the form |
| .Pf $(( Ns Ar expression Ns )) . |
| 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 |
| .Ic local |
| and |
| .Ic return |
| work, and in that |
| .Ic exit |
| terminates the parent shell; shell options are shared. |
| .Pp |
| Another variant of substitution are the valsubs (value substitutions) |
| .Pf ${\*(Ba\& Ns Ar command Ns \&;} |
| 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 |
| .Ev REPLY |
| is set to within the |
| .Ar command Ns s . |
| .Pp |
| 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 |
| .Ev IFS |
| parameter. |
| The |
| .Ev 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 |
| .Ev IFS |
| octets are called |
| .Dq IFS whitespace . |
| Sequences of one or more |
| .Ev IFS |
| whitespace octets, in combination with zero or one |
| .Pf non- Ev IFS |
| whitespace octets, delimit a field. |
| As a special case, leading and trailing |
| .Ev IFS |
| whitespace is stripped (i.e. no leading or trailing empty field |
| is created by it); leading or trailing |
| .Pf non- Ev IFS |
| whitespace does create an empty field. |
| .Pp |
| Example: If |
| .Ev IFS |
| is set to |
| .Dq Li \*(Ltspace\*(Gt: |
| and VAR is set to |
| .Dq Li \*(Ltspace\*(GtA\*(Ltspace\*(Gt:\*(Ltspace\*(Gt\*(Ltspace\*(GtB::D , |
| the substitution for $VAR results in four fields: |
| .Dq Li A , |
| .Dq Li B , |
| .Dq |
| (an empty field) and |
| .Dq Li D . |
| Note that if the |
| .Ev 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. |
| .Pp |
| Also, note that the field splitting applies only to the immediate result of |
| the substitution. |
| Using the previous example, the substitution for $VAR:E |
| results in the fields: |
| .Dq Li A , |
| .Dq Li B , |
| .Dq |
| and |
| .Dq Li D:E , |
| not |
| .Dq Li A , |
| .Dq Li B , |
| .Dq , |
| .Dq Li D |
| and |
| .Dq Li 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 |
| .Dv IFS |
| as a general whitespace delimiter. |
| .Pp |
| The results of substitution are, unless otherwise specified, also subject to |
| brace expansion and file name expansion (see the relevant sections below). |
| .Pp |
| A command substitution is replaced by the output generated by the specified |
| command which is run in a subshell. |
| For |
| .Pf $( Ns Ar command Ns \&) |
| and |
| .Pf ${\*(Ba\& Ns Ar command Ns \&;} |
| and |
| .Pf ${\ \& Ar command Ns \&;} |
| substitutions, normal quoting rules are used when |
| .Ar command |
| is parsed; however, for the deprecated |
| .Pf \` Ns Ar command Ns \` |
| form, a |
| .Ql \e |
| followed by any of |
| .Ql $ , |
| .Ql \` |
| or |
| .Ql \e |
| is stripped (as is |
| .Ql \&" |
| when the substitution is part of a double-quoted string); a backslash |
| .Ql \e |
| followed by any other character is unchanged. |
| As a special case in command substitutions, a command of the form |
| .Pf \*(Lt Ar file |
| is interpreted to mean substitute the contents of |
| .Ar file . |
| Note that |
| .Ic $(\*(Ltfoo) |
| has the same effect as |
| .Ic $(cat foo) . |
| .Pp |
| Note that some shells do not use a recursive parser for command substitutions, |
| leading to failure for certain constructs; to be portable, use as workaround |
| .Dq Li x=$(cat) \*(Lt\*(Lt\eEOF |
| (or the newline-keeping |
| .Dq Li x=\*(Lt\*(Lt\eEOF |
| extension) instead to merely slurp the string. |
| .St -p1003.1 |
| recommends using case statements of the form |
| .Li "x=$(case $foo in (bar) echo $bar ;; (*) echo $baz ;; esac)" |
| instead, which would work but not serve as example for this portability issue. |
| .Bd -literal -offset indent |
| x=$(case $foo in bar) echo $bar ;; *) echo $baz ;; esac) |
| # above fails to parse on old shells; below is the workaround |
| x=$(eval $(cat)) \*(Lt\*(Lt\eEOF |
| case $foo in bar) echo $bar ;; *) echo $baz ;; esac |
| EOF |
| .Ed |
| .Pp |
| Arithmetic substitutions are replaced by the value of the specified expression. |
| For example, the command |
| .Ic print $((2+3*4)) |
| displays 14. |
| See |
| .Sx Arithmetic expressions |
| for a description of an expression. |
| .Ss 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 letters or digits |
| .Po |
| .Ql _ |
| counts as a letter |
| .Pc . |
| The latter form can be treated as arrays by appending an array index of the |
| form |
| .Op Ar expr |
| where |
| .Ar expr |
| is an arithmetic expression. |
| Array indices in |
| .Nm |
| are limited to the range 0 through 4294967295, inclusive. |
| That is, they are a 32-bit unsigned integer. |
| .Pp |
| Parameter substitutions take the form |
| .Pf $ Ns Ar name , |
| .Pf ${ Ns Ar name Ns } |
| or |
| .Sm off |
| .Pf ${ Ar name Oo Ar expr Oc } |
| .Sm on |
| where |
| .Ar name |
| is a parameter name. |
| Substitutions of an array in scalar context, i.e. without an |
| .Ar expr |
| in the latter form mentioned above, expand the element with the key |
| .Dq 0 . |
| Substitution of all array elements with |
| .Pf ${ Ns Ar name Ns \&[*]} |
| and |
| .Pf ${ Ns Ar name Ns \&[@]} |
| works equivalent to $* and $@ for positional parameters. |
| If substitution is performed on a parameter |
| (or an array parameter element) |
| that is not set, an empty string is substituted unless the |
| .Ic nounset |
| option |
| .Pq Ic set Fl u |
| is set, in which case an error occurs. |
| .Pp |
| Parameters can be assigned values in a number of ways. |
| First, the shell implicitly sets some parameters like |
| .Dq Li # , |
| .Dq Li PWD |
| and |
| .Dq Li $ ; |
| 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 example, |
| .Ic FOO=bar |
| sets the parameter |
| .Dq Li FOO |
| to |
| .Dq Li bar ; |
| multiple parameter assignments can be given on a single command line and they |
| can be followed by a simple-command, in which case the assignments are in |
| effect only for the duration of the command (such assignments are also |
| exported; see below for the implications of this). |
| Note that both the parameter name and the |
| .Ql = |
| must be unquoted for the shell to recognise a parameter assignment. |
| The construct |
| .Ic 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 |
| .Ic export , |
| .Ic readonly |
| and |
| .Ic typeset |
| commands; see their descriptions in the |
| .Sx Command execution |
| section. |
| Fifth, |
| .Ic for |
| and |
| .Ic select |
| loops set parameters as well as the |
| .Ic getopts , |
| .Ic read |
| and |
| .Ic set Fl A |
| commands. |
| Lastly, parameters can be assigned values using assignment operators |
| inside arithmetic expressions (see |
| .Sx Arithmetic expressions |
| below) or using the |
| .Sm off |
| .Pf ${ Ar name No = Ar value No } |
| .Sm on |
| form of the parameter substitution (see below). |
| .Pp |
| Parameters with the export attribute (set using the |
| .Ic export |
| or |
| .Ic typeset Fl x |
| commands, or by parameter assignments followed by simple commands) are put in |
| the environment (see |
| .Xr environ 7 ) |
| of commands run by the shell as |
| .Ar name Ns = Ns Ar 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 automatically sets the export attribute for those |
| parameters. |
| .Pp |
| Modifiers can be applied to the |
| .Pf ${ Ns Ar name Ns } |
| form of parameter substitution: |
| .Bl -tag -width Ds |
| .Sm off |
| .It ${ Ar name No :\- Ar word No } |
| .Sm on |
| If |
| .Ar name |
| is set and not empty, |
| it is substituted; otherwise, |
| .Ar word |
| is substituted. |
| .Sm off |
| .It ${ Ar name No :+ Ar word No } |
| .Sm on |
| If |
| .Ar name |
| is set and not empty, |
| .Ar word |
| is substituted; otherwise, nothing is substituted. |
| .Sm off |
| .It ${ Ar name No := Ar word No } |
| .Sm on |
| If |
| .Ar name |
| is set and not empty, |
| it is substituted; otherwise, it is assigned |
| .Ar word |
| and the resulting value of |
| .Ar name |
| is substituted. |
| .Sm off |
| .It ${ Ar name No :? Ar word No } |
| .Sm on |
| If |
| .Ar name |
| is set and not empty, |
| it is substituted; otherwise, |
| .Ar word |
| is printed on standard error (preceded by |
| .Ar name : ) |
| and an error occurs (normally causing termination of a shell script, function, |
| or a script sourced using the |
| .Dq Li \&. |
| built-in). |
| If |
| .Ar word |
| is omitted, the string |
| .Dq Li parameter null or not set |
| is used instead. |
| .El |
| .Pp |
| Note that, for all of the above, |
| .Ar word |
| is actually considered quoted, and special parsing rules apply. |
| The parsing rules also differ on whether the expression is double-quoted: |
| .Ar word |
| then uses double-quoting rules, except for the double quote itself |
| .Pq Ql \&" |
| and the closing brace, which, if backslash escaped, gets quote removal applied. |
| .Pp |
| In the above modifiers, the |
| .Ql \&: |
| can be omitted, in which case the conditions only depend on |
| .Ar name |
| being set (as opposed to set and not empty). |
| If |
| .Ar word |
| is needed, parameter, command, arithmetic and tilde substitution are performed |
| on it; if |
| .Ar word |
| is not needed, it is not evaluated. |
| .Pp |
| The following forms of parameter substitution can also be used: |
| .Pp |
| .Bl -tag -width Ds -compact |
| .It Pf ${# Ns Ar name Ns \&} |
| The number of positional parameters if |
| .Ar name |
| is |
| .Dq Li * , |
| .Dq Li @ |
| or not specified; otherwise the length |
| .Pq in characters |
| of the string value of parameter |
| .Ar name . |
| .Pp |
| .It Pf ${# Ns Ar name Ns \&[*]} |
| .It Pf ${# Ns Ar name Ns \&[@]} |
| The number of elements in the array |
| .Ar name . |
| .Pp |
| .It Pf ${% Ns Ar name Ns \&} |
| The width |
| .Pq in screen columns |
| of the string value of parameter |
| .Ar name , |
| or \-1 if |
| .Pf ${ Ns Ar name Ns } |
| contains a control character. |
| .Pp |
| .It Pf ${! Ns Ar name Ns } |
| The name of the variable referred to by |
| .Ar name . |
| This will be |
| .Ar name |
| except when |
| .Ar name |
| is a name reference (bound variable), created by the |
| .Ic nameref |
| command (which is an alias for |
| .Ic typeset Fl n ) . |
| .Ar name |
| cannot be one of most special parameters (see below). |
| .Pp |
| .It Pf ${! Ns Ar name Ns \&[*]} |
| .It Pf ${! Ns Ar name Ns \&[@]} |
| The names of indices (keys) in the array |
| .Ar name . |
| .Pp |
| .Sm off |
| .It Xo |
| .Pf ${ Ar name |
| .Pf # Ar pattern No } |
| .Xc |
| .It Xo |
| .Pf ${ Ar name |
| .Pf ## Ar pattern No } |
| .Xc |
| .Sm on |
| If |
| .Ar pattern |
| matches the beginning of the value of parameter |
| .Ar name , |
| the matched text is deleted from the result of substitution. |
| A single |
| .Ql # |
| results in the shortest match, and two |
| of them result in the longest match. |
| .Pp |
| .Sm off |
| .It Xo |
| .Pf ${ Ar name |
| .Pf % Ar pattern No } |
| .Xc |
| .It Xo |
| .Pf ${ Ar name |
| .Pf %% Ar pattern No } |
| .Xc |
| .Sm on |
| Like ${...#...} but deletes from the end of the value. |
| .Pp |
| .Sm off |
| .It Xo |
| .Pf ${ Ar name |
| .Pf / Ar pattern / Ar string No } |
| .Xc |
| .It Xo |
| .Pf ${ Ar name |
| .Pf /# Ar pattern / Ar string No } |
| .Xc |
| .It Xo |
| .Pf ${ Ar name |
| .Pf /% Ar pattern / Ar string No } |
| .Xc |
| .It Xo |
| .Pf ${ Ar name |
| .Pf // Ar pattern / Ar string No } |
| .Xc |
| .Sm on |
| The longest match of |
| .Ar pattern |
| in the value of parameter |
| .Ar name |
| is replaced with |
| .Ar string |
| (deleted if |
| .Ar string |
| is empty; the trailing slash |
| .Pq Ql / |
| may be omitted in that case). |
| A leading slash followed by |
| .Ql # |
| or |
| .Ql % |
| causes the pattern to be anchored at the beginning or end of |
| the value, respectively; empty unanchored |
| .Ar pattern Ns s |
| cause no replacement; a single leading slash or use of a |
| .Ar 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. |
| .Pp |
| .Sm off |
| .It Xo |
| .Pf ${ Ar name |
| .Pf @/ Ar pattern / Ar string No } |
| .Xc |
| .Sm on |
| The same as |
| .Sm off |
| .Xo |
| .Pf ${ Ar name |
| .Pf // Ar pattern / Ar string No } , |
| .Xc |
| .Sm on |
| except that both |
| .Ar pattern |
| and |
| .Ar string |
| are expanded anew for each iteration. |
| Use with |
| .Ev KSH_MATCH . |
| .Pp |
| .Sm off |
| .It Xo |
| .Pf ${ Ar name : Ns Ar pos |
| .Pf : Ns Ar len Ns } |
| .Xc |
| .Sm on |
| The first |
| .Ar len |
| characters of |
| .Ar name , |
| starting at position |
| .Ar pos , |
| are substituted. |
| Both |
| .Ar pos |
| and |
| .Pf : Ns Ar len |
| are optional. |
| If |
| .Ar pos |
| is negative, counting starts at the end of the string; if it |
| is omitted, it defaults to 0. |
| If |
| .Ar len |
| is omitted or greater than the length of the remaining string, |
| all of it is substituted. |
| Both |
| .Ar pos |
| and |
| .Ar len |
| are evaluated as arithmetic expressions. |
| .Pp |
| .It Pf ${ Ns Ar name Ns @#} |
| The hash (using the BAFH algorithm) of the expansion of |
| .Ar name . |
| This is also used internally for the shell's hashtables. |
| .Pp |
| .It Pf ${ Ns Ar name Ns @Q} |
| A quoted expression safe for re-entry, whose value is the value of the |
| .Ar name |
| parameter, is substituted. |
| .El |
| .Pp |
| Note that |
| .Ar pattern |
| may need extended globbing pattern |
| .Pq @(...) , |
| single |
| .Pq \&\*(aq...\&\*(aq |
| or double |
| .Pq \&"...\&" |
| quote escaping unless |
| .Fl o Ic sh |
| is set. |
| .Pp |
| The following special parameters are implicitly set by the shell and cannot be |
| set directly using assignments: |
| .Bl -tag -width "1 .. 9" |
| .It Ev \&! |
| Process ID of the last background process started. |
| If no background processes have been started, the parameter is not set. |
| .It Ev \&# |
| The number of positional parameters ($1, $2, etc.). |
| .It Ev \&$ |
| The PID of the shell or, if it is a subshell, the PID of the original shell. |
| Do |
| .Em NOT |
| use this mechanism for generating temporary file names; see |
| .Xr mktemp 1 |
| instead. |
| .It Ev \- |
| The concatenation of the current single letter options (see the |
| .Ic set |
| command below for a list of options). |
| .It Ev \&? |
| The exit status of the last non-asynchronous command executed. |
| If the last command was killed by a signal, |
| .Ic \&$? |
| is set to 128 plus the signal number, but at most 255. |
| .It Ev 0 |
| The name of the shell, determined as follows: |
| the first argument to |
| .Nm |
| if it was invoked with the |
| .Fl c |
| option and arguments were given; otherwise the |
| .Ar file |
| argument, if it was supplied; or else the name the shell was invoked with |
| .Pq i.e.\& Li argv[0] . |
| .Ev $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 |
| .Ic function |
| keyword (i.e. a Korn shell style function). |
| .It Ev 1 No .. Ev 9 |
| The first nine positional parameters that were supplied to the shell, function, |
| or script sourced using the |
| .Dq Li \&. |
| built-in. |
| Further positional parameters may be accessed using |
| .Pf ${ Ar number Ns } . |
| .It Ev * |
| All positional parameters (except 0), i.e. $1, $2, $3, ... |
| .br |
| 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 |
| .Ev IFS |
| parameter (or the empty string if |
| .Ev IFS |
| is unset. |
| .It Ev @ |
| Same as |
| .Ic $* , |
| unless it is used inside double quotes, in which case a separate word is |
| generated for each positional parameter. |
| If there are no positional parameters, no word is generated. |
| .Ic \&"$@" |
| can be used to access arguments, verbatim, without losing |
| empty arguments or splitting arguments with spaces (IFS, actually). |
| .El |
| .Pp |
| The following parameters are set and/or used by the shell: |
| .Bl -tag -width "KSH_VERSION" |
| .It Ev _ |
| .Pq 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 interactive use, this parameter is also set in the parent shell to the last |
| word of the previous command. |
| .It Ev BASHPID |
| The PID of the shell or subshell. |
| .It Ev CDPATH |
| Like |
| .Ev PATH , |
| but used to resolve the argument to the |
| .Ic cd |
| built-in command. |
| Note that if |
| .Ev CDPATH |
| is set and does not contain |
| .Dq Li \&. |
| or an empty string element, the current directory is not searched. |
| Also, the |
| .Ic cd |
| built-in command will display the resulting directory when a match is found |
| in any search path other than the empty path. |
| .It Ev 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 |
| .Xr stty 1 |
| is non-zero and sane enough (minimum is 12x3), defaults to 80; similar for |
| .Ev LINES . |
| This parameter is used by the interactive line editing modes and by the |
| .Ic select , |
| .Ic set Fl o |
| and |
| .Ic kill Fl l |
| commands to format information columns. |
| Importing from the environment or unsetting this parameter removes the |
| binding to the actual terminal size in favour of the provided value. |
| .It Ev 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. |
| .It Ev EPOCHREALTIME |
| Time since the epoch, as returned by |
| .Xr gettimeofday 2 , |
| formatted as decimal |
| .Va tv_sec |
| followed by a dot |
| .Pq Ql \&. |
| and |
| .Va tv_usec |
| padded to exactly six decimal digits. |
| .It Ev EXECSHELL |
| If set, this parameter is assumed to contain the shell that is to be used to |
| execute commands that |
| .Xr execve 2 |
| fails to execute and which do not start with a |
| .Dq Li #! Ns Ar shell |
| sequence. |
| .It Ev FCEDIT |
| The editor used by the |
| .Ic fc |
| command (see below). |
| .It Ev FPATH |
| Like |
| .Ev 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 |
| .Ev PATH . |
| See |
| .Sx Functions |
| below for more information. |
| .It Ev HISTFILE |
| The name of the file used to store command history. |
| When assigned to or unset, the file is opened, history is truncated |
| 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 |
| .Ev HISTFILE |
| parameters all point to the same file. |
| .Pp |
| .Sy Note : |
| If |
| .Ev HISTFILE |
| is unset or empty, no history file is used. |
| This is different from |
| .At |
| .Nm ksh . |
| .It Ev HISTSIZE |
| The number of commands normally stored for history. |
| The default is 2047. |
| The maximum is 65535. |
| .It Ev HOME |
| The default directory for the |
| .Ic cd |
| command and the value substituted for an unqualified |
| .Ic \*(TI |
| (see |
| .Sx Tilde expansion |
| below). |
| .It Ev IFS |
| Internal field separator, used during substitution and by the |
| .Ic read |
| command, to split values into distinct arguments; normally set to space, tab |
| and newline. |
| See |
| .Sx Substitution |
| above for details. |
| .Pp |
| .Sy Note : |
| This parameter is not imported from the environment when the shell is |
| started. |
| .It Ev KSHEGID |
| The effective group id of the shell at startup. |
| .It Ev KSHGID |
| The real group id of the shell at startup. |
| .It Ev KSHUID |
| The real user id of the shell at startup. |
| .It Ev 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 |
| .Ic case |
| when a match is encountered, and by the substitution operations |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf # Ar pat No } , |
| .Sm on |
| .Xc |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf ## Ar pat No } , |
| .Sm on |
| .Xc |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf % Ar pat No } , |
| .Sm on |
| .Xc |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf %% Ar pat No } , |
| .Sm on |
| .Xc |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf / Ar pat / Ar rpl No } , |
| .Sm on |
| .Xc |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf /# Ar pat / Ar rpl No } , |
| .Sm on |
| .Xc |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf /% Ar pat / Ar rpl No } , |
| .Sm on |
| .Xc |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf // Ar pat / Ar rpl No } , |
| .Sm on |
| .Xc |
| and |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf @/ Ar pat / Ar rpl No } . |
| .Sm on |
| .Xc |
| See the end of the Emacs editing mode documentation for an example. |
| .It Ev KSH_VERSION |
| The name (self-identification) and version of the shell (read-only). |
| See also the version commands in |
| .Sx Emacs editing mode |
| and |
| .Sx Vi editing mode |
| sections, below. |
| .It Ev LINENO |
| The line number of the function or shell script that is currently being |
| executed. |
| .It Ev LINES |
| Set to the number of lines on the terminal or window. |
| Defaults to 24; always set, unless imported or unset. |
| See |
| .Ev COLUMNS . |
| .It Ev OLDPWD |
| The previous working directory. |
| Unset if |
| .Ic cd |
| has not successfully changed directories since the shell started or if the |
| shell doesn't know where it is. |
| .It Ev OPTARG |
| When using |
| .Ic getopts , |
| it contains the argument for a parsed option, if it requires one. |
| .It Ev OPTIND |
| The index of the next argument to be processed when using |
| .Ic getopts . |
| Assigning 1 to this parameter causes |
| .Ic getopts |
| to process arguments from the beginning the next time it is invoked. |
| .It Ev PATH |
| A colon (semicolon on OS/2) separated list of directories that are |
| searched when looking for commands and files sourced using the |
| .Dq Li \&. |
| command (see below). |
| An empty string resulting from a leading or trailing |
| (semi)colon, or two adjacent ones, is treated as a |
| .Dq Li \&. |
| (the current directory). |
| .It Ev PATHSEP |
| A colon (semicolon on OS/2), for the user's convenience. |
| .It Ev PGRP |
| The process ID of the shell's process group leader. |
| .It Ev PIPESTATUS |
| An array containing the errorlevel (exit status) codes, |
| one by one, of the last pipeline run in the foreground. |
| .It Ev PPID |
| The process ID of the shell's parent. |
| .It Ev PS1 |
| The primary prompt for interactive shells. |
| Parameter, command and arithmetic |
| substitutions are performed, and |
| .Ql \&! |
| is replaced with the current command number (see the |
| .Ic fc |
| command below). |
| A literal |
| .Ql \&! |
| can be put in the prompt by placing |
| .Dq Li !! |
| in |
| .Ev PS1 . |
| .Pp |
| The default prompt is |
| .Dq Li $\ \& |
| for non-root users, |
| .Dq Li #\ \& |
| for root. |
| If |
| .Nm |
| is invoked by root and |
| .Ev PS1 |
| does not contain a |
| .Ql # |
| character, the default value will be used even if |
| .Ev PS1 |
| already exists in the environment. |
| .Pp |
| The |
| .Nm |
| distribution comes with a sample |
| .Pa dot.mkshrc |
| containing 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 |
| .Ev PS1 |
| assignment time, while the $USER and $PWD are escaped |
| and thus will be evaluated each time a prompt is displayed): |
| .Bd -literal |
| PS1=\*(aq${USER:=$(id \-un)}\*(aq"@${HOSTNAME:=$(hostname)}:\e$PWD $( |
| if (( USER_ID )); then print \e$; else print \e#; fi) " |
| .Ed |
| .Pp |
| 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 certain |
| 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 |
| .Xr ksh88 1 , |
| which did print the delimiter character so you were out of luck |
| if you did not have any non-printing characters. |
| .Pp |
| Since backslashes and other special characters may be |
| interpreted by the shell, to set |
| .Ev PS1 |
| either escape the backslash 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 |
| .Ic \*(haV |
| in the emacs editing mode), |
| which embeds the current working directory, |
| in reverse video |
| .Pq colour would work, too , |
| in the prompt string: |
| .Bd -literal -offset indent |
| x=$(print \e\e001) # otherwise unused char |
| PS1="$x$(print \e\er)$x$(tput so)$x\e$PWD$x$(tput se)$x\*(Gt " |
| .Ed |
| .Pp |
| Due to a strong suggestion from David G. Korn, |
| .Nm |
| now also supports the following form: |
| .Bd -literal -offset indent |
| PS1=$\*(aq\e1\er\e1\ee[7m\e1$PWD\e1\ee[0m\e1\*(Gt \*(aq |
| .Ed |
| .It Ev PS2 |
| Secondary prompt string, by default |
| .Dq Li \*(Gt\ \& , |
| used when more input is needed to complete a command. |
| .It Ev PS3 |
| Prompt used by the |
| .Ic select |
| statement when reading a menu selection. |
| The default is |
| .Dq Li #?\ \& . |
| .It Ev PS4 |
| Used to prefix commands that are printed during execution tracing (see the |
| .Ic set Fl x |
| command below). |
| Parameter, command and arithmetic substitutions are performed |
| before it is printed. |
| The default is |
| .Dq Li +\ \& . |
| You may want to set it to |
| .Dq Li \&[$EPOCHREALTIME]\ \& |
| instead, to include timestamps. |
| .It Ev PWD |
| The current working directory. |
| May be unset or empty if the shell doesn't know where it is. |
| .It Ev RANDOM |
| Each time |
| .Ev RANDOM |
| is referenced, it is assigned a number between 0 and 32767 from |
| a Linear Congruential PRNG first. |
| .It Ev REPLY |
| Default parameter for the |
| .Ic read |
| command if no names are given. |
| Also used in |
| .Ic select |
| loops to store the value that is read from standard input. |
| .It Ev 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. |
| .It Ev 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 |
| .Pq Ev PS1 . |
| If the time is exceeded, the shell exits. |
| .It Ev 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 |
| .Pa /tmp . |
| .It Ev USER_ID |
| The effective user id of the shell at startup. |
| .El |
| .Ss Tilde expansion |
| Tilde expansion, which is done in parallel with parameter substitution, |
| is applied to words starting with an unquoted |
| .Ql \*(TI . |
| In parameter assignments (such as those preceding a simple-command or those |
| occurring in the arguments of a declaration utility), tilde expansion is done |
| after any assignment (i.e. after the equals sign) or after an unquoted colon |
| .Pq Ql \&: ; |
| 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 |
| completion for tildes after all unquoted colons during command line editing. |
| .Pp |
| The characters following the tilde, up to the first |
| .Ql / , |
| if any, are assumed to be a login name. |
| If the login name is empty, |
| .Ql + |
| or |
| .Ql \- , |
| the simplified value of the |
| .Ev HOME , |
| .Ev PWD |
| or |
| .Ev OLDPWD |
| parameter is substituted, 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. |
| .Pp |
| The home directory of previously expanded login names are cached and re-used. |
| The |
| .Ic alias Fl d |
| command may be used to list, change and add to this cache (e.g.\& |
| .Ic alias \-d fac=/usr/local/facilities; cd \*(TIfac/bin ) . |
| .Ss Brace expansion (alternation) |
| Brace expressions take the following form: |
| .Bd -unfilled -offset indent |
| .Sm off |
| .Xo |
| .Ar prefix No { Ar str1 No ,..., |
| .Ar strN No } Ar suffix |
| .Xc |
| .Sm on |
| .Ed |
| .Pp |
| The expressions are expanded to |
| .Ar N |
| words, each of which is the concatenation of |
| .Ar prefix , |
| .Ar str Ns i |
| and |
| .Ar suffix |
| (e.g.\& |
| .Dq Li a{c,b{X,Y},d}e |
| expands to four words: |
| .Dq Li ace , |
| .Dq Li abXe , |
| .Dq Li abYe |
| and |
| .Dq Li 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 |
| .Pq Ql \&, |
| for expansion to occur (e.g.\& |
| .Ic {} |
| and |
| .Ic {foo} |
| are not expanded). |
| Brace expansion is carried out after parameter substitution |
| and before file name generation. |
| .Ss File name patterns |
| A file name pattern is a word containing one or more unquoted |
| .Ql \&? , |
| .Ql * , |
| .Ql + , |
| .Ql @ |
| or |
| .Ql \&! |
| characters or |
| .Dq Li \&[...] |
| 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 following meaning: |
| .Bl -tag -width Ds |
| .It \&? |
| Matches any single character. |
| .It \&* |
| Matches any sequence of octets. |
| .It \&[...] |
| Matches any of the octets inside the brackets. |
| Ranges of octets can be specified by separating two octets by a |
| .Ql \- |
| (e.g.\& |
| .Dq Li \&[a0\-9] |
| matches the letter |
| .Ql a |
| or any digit). |
| In order to represent itself, a |
| .Ql \- |
| must either be quoted or the first or last octet in the octet list. |
| Similarly, a |
| .Ql \&] |
| must be quoted or the first octet in the list if it is to represent itself |
| instead of the end of the list. |
| Also, a |
| .Ql \&! |
| appearing at the start of the list has special meaning (see below), so to |
| represent itself it must be quoted or appear later in the list. |
| .It \&[!...] |
| Like [...], |
| except it matches any octet not inside the brackets. |
| .Sm off |
| .It *( Ar pattern\*(Ba No ...\*(Ba Ar pattern ) |
| .Sm on |
| Matches any string of octets that matches zero or more occurrences of the |
| specified patterns. |
| Example: The pattern |
| .Ic *(foo\*(Babar) |
| matches the strings |
| .Dq , |
| .Dq Li foo , |
| .Dq Li bar , |
| .Dq Li foobarfoo , |
| etc. |
| .Sm off |
| .It +( Ar pattern\*(Ba No ...\*(Ba Ar pattern ) |
| .Sm on |
| Matches any string of octets that matches one or more occurrences of the |
| specified patterns. |
| Example: The pattern |
| .Ic +(foo\*(Babar) |
| matches the strings |
| .Dq Li foo , |
| .Dq Li bar , |
| .Dq Li foobar , |
| etc. |
| .Sm off |
| .It ?( Ar pattern\*(Ba No ...\*(Ba Ar pattern ) |
| .Sm on |
| Matches the empty string or a string that matches one of the specified |
| patterns. |
| Example: The pattern |
| .Ic ?(foo\*(Babar) |
| only matches the strings |
| .Dq , |
| .Dq Li foo |
| and |
| .Dq Li bar . |
| .Sm off |
| .It @( Ar pattern\*(Ba No ...\*(Ba Ar pattern ) |
| .Sm on |
| Matches a string that matches one of the specified patterns. |
| Example: The pattern |
| .Ic @(foo\*(Babar) |
| only matches the strings |
| .Dq Li foo |
| and |
| .Dq Li bar . |
| .Sm off |
| .It !( Ar pattern\*(Ba No ...\*(Ba Ar pattern ) |
| .Sm on |
| Matches any string that does not match one of the specified patterns. |
| Examples: The pattern |
| .Ic !(foo\*(Babar) |
| matches all strings except |
| .Dq Li foo |
| and |
| .Dq Li bar ; |
| the pattern |
| .Ic \&!(*) |
| matches no strings; the pattern |
| .Ic \&!(?)* |
| matches all strings (think about it). |
| .El |
| .Pp |
| Note that complicated globbing, especially with alternatives, |
| is slow; using separate comparisons may (or may not) be faster. |
| .Pp |
| Note that |
| .Nm mksh |
| .Po and Nm pdksh Pc |
| never matches |
| .Dq Li \&. |
| and |
| .Dq Li .. , |
| but |
| .At |
| .Nm ksh , |
| Bourne |
| .Nm sh |
| and GNU |
| .Nm bash |
| do. |
| .Pp |
| Note that none of the above pattern elements match either a period |
| .Pq Ql \&. |
| at the start of a file name or a slash |
| .Pq Ql / , |
| even if they are explicitly used in a [...] sequence; also, the names |
| .Dq Li \&. |
| and |
| .Dq Li .. |
| are never matched, even by the pattern |
| .Dq Li .* . |
| .Pp |
| If the |
| .Ic markdirs |
| option is set, any directories that result from file name generation are marked |
| with a trailing |
| .Ql / . |
| .Ss 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 |
| .Pa /dev/null , |
| and commands for which any of the following redirections have been specified: |
| .Bl -tag -width XXxxmarker |
| .It \*(Gt Ns Ar file |
| Standard output is redirected to |
| .Ar file . |
| If |
| .Ar file |
| does not exist, it is created; if it does exist, is a regular file, and the |
| .Ic noclobber |
| option is set, an error occurs; otherwise, the file is truncated. |
| Note that this means the command |
| .Ic cmd \*(Ltfoo \*(Gtfoo |
| will open |
| .Ar foo |
| for reading and then truncate it when it opens it for writing, before |
| .Ar cmd |
| gets a chance to actually read |
| .Ar foo . |
| .It \*(Gt\*(Ba Ns Ar file |
| Same as |
| .Ic \*(Gt , |
| except the file is truncated, even if the |
| .Ic noclobber |
| option is set. |
| .It \*(Gt\*(Gt Ns Ar file |
| Same as |
| .Ic \*(Gt , |
| except if |
| .Ar 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 |
| .Xr open 2 ) . |
| .It \*(Lt Ns Ar file |
| Standard input is redirected from |
| .Ar file , |
| which is opened for reading. |
| .It \*(Lt\*(Gt Ns Ar file |
| Same as |
| .Ic \*(Lt , |
| except the file is opened for reading and writing. |
| .It \*(Lt\*(Lt Ns Ar marker |
| After reading the command line containing this kind of redirection (called a |
| .Dq here document ) , |
| the shell copies lines from the command source into a temporary file until a |
| line matching |
| .Ar marker |
| is read. |
| When the command is executed, standard input is redirected from the |
| temporary file. |
| If |
| .Ar marker |
| contains no quoted characters, the contents of the temporary file are processed |
| as if enclosed in double quotes each time the command is executed, so |
| parameter, command and arithmetic substitutions are performed, along with |
| backslash |
| .Pq Ql \e |
| escapes for |
| .Ql $ , |
| .Ql \` , |
| .Ql \e |
| and |
| .Dq Li \enewline , |
| but not for |
| .Ql \&" . |
| If multiple here documents are used on the same command line, they are saved in |
| order. |
| .Pp |
| If no |
| .Ar marker |
| is given, the here document ends at the next |
| .Ic \*(Lt\*(Lt |
| and substitution will be performed. |
| If |
| .Ar marker |
| is only a set of either single |
| .Dq Li \*(aq\*(aq |
| or double |
| .Ql \&"" |
| quotes with nothing in between, the here document ends at the next empty line |
| and substitution will not be performed. |
| .It \*(Lt\*(Lt\- Ns Ar marker |
| Same as |
| .Ic \*(Lt\*(Lt , |
| except leading tabs are stripped from lines in the here document. |
| .It \*(Lt\*(Lt\*(Lt Ns Ar word |
| Same as |
| .Ic \*(Lt\*(Lt , |
| except that |
| .Ar word |
| .Em is |
| the here document. |
| This is called a here string. |
| .It \*(Lt& Ns Ar fd |
| Standard input is duplicated from file descriptor |
| .Ar fd . |
| .Ar fd |
| can be a single digit, indicating the number of an existing file descriptor; |
| the letter |
| .Ql p , |
| indicating the file descriptor associated with the output of the current |
| co-process; or the character |
| .Ql \- , |
| indicating standard input is to be closed. |
| .It \*(Gt& Ns Ar fd |
| Same as |
| .Ic \*(Lt& , |
| except the operation is done on standard output. |
| .It &\*(Gt Ns Ar file |
| Same as |
| .Ic \*(Gt Ns Ar file 2\*(Gt&1 . |
| This is a deprecated (legacy) GNU |
| .Nm bash |
| extension supported by |
| .Nm |
| which also supports the preceding explicit fd digit, for example, |
| .Ic 3&\*(Gt Ns Ar file |
| is the same as |
| .Ic 3\*(Gt Ns Ar file 2\*(Gt&3 |
| in |
| .Nm |
| but a syntax error in GNU |
| .Nm bash . |
| .It Xo |
| .No &\*(Gt\*(Ba Ns Ar file , |
| .No &\*(Gt\*(Gt Ns Ar file , |
| .No &\*(Gt& Ns Ar fd |
| .Xc |
| Same as |
| .Ic \*(Gt\*(Ba Ns Ar file , |
| .Ic \*(Gt\*(Gt Ns Ar file |
| or |
| .Ic \*(Gt& Ns Ar fd , |
| followed by |
| .Ic 2\*(Gt&1 , |
| as above. |
| These are |
| .Nm |
| extensions. |
| .El |
| .Pp |
| In any of the above redirections, the file descriptor that is redirected |
| (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 |
| .Ar file , |
| .Ar marker |
| and |
| .Ar 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. |
| .Pp |
| For simple-commands, redirections may appear anywhere in the command; for |
| compound-commands |
| .Po |
| .Ic if |
| statements, etc. |
| .Pc , |
| any redirections must appear at the end. |
| Redirections are processed after |
| pipelines are created and in the order they are given, so the following |
| will print an error with a line number prepended to it: |
| .Pp |
| .Dl $ cat /foo/bar 2\*(Gt&1 \*(Gt/dev/null \*(Ba pr \-n \-t |
| .Pp |
| File descriptors created by I/O redirections are private to the shell. |
| .Ss Arithmetic expressions |
| Integer arithmetic expressions can be used with the |
| .Ic let |
| command, inside $((...)) expressions, inside array references (e.g.\& |
| .Ar name Ns Bq Ar expr ) , |
| as numeric arguments to the |
| .Ic test |
| command, and as the value of an assignment to an integer parameter. |
| .Em Warning : |
| This also affects implicit conversion to integer, for example as done by the |
| .Ic let |
| command. |
| .Em Never |
| use unchecked user input, e.g. from the environment, in an arithmetic context! |
| .Pp |
| Expressions are calculated using signed arithmetic and the |
| .Vt mksh_ari_t |
| type (a 32-bit signed integer), unless they begin with a sole |
| .Ql # |
| character, in which case they use |
| .Vt mksh_uari_t |
| .Po a 32-bit unsigned integer Pc . |
| .Pp |
| Expressions may contain alpha-numeric parameter identifiers, array references |
| and integer constants and may be combined with the following C operators |
| (listed and grouped in increasing order of precedence): |
| .Pp |
| Unary operators: |
| .Bd -literal -offset indent |
| + \- ! \*(TI ++ \-\- |
| .Ed |
| .Pp |
| Binary operators: |
| .Bd -literal -offset indent |
| , |
| = += \-= *= /= %= \*(Lt\*(Lt= \*(Gt\*(Gt= \*(ha\*(Lt= \*(ha\*(Gt= &= \*(ha= \*(Ba= |
| \*(Ba\*(Ba |
| && |
| \*(Ba |
| \*(ha |
| & |
| == != |
| \*(Lt \*(Lt= \*(Gt \*(Gt= |
| \*(Lt\*(Lt \*(Gt\*(Gt \*(ha\*(Lt \*(ha\*(Gt |
| + \- |
| * / % |
| .Ed |
| .Pp |
| Ternary operators: |
| .Bd -literal -offset indent |
| ?: (precedence is immediately higher than assignment) |
| .Ed |
| .Pp |
| Grouping operators: |
| .Bd -literal -offset indent |
| ( ) |
| .Ed |
| .Pp |
| 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 using the notation |
| .Ar base Ns # Ns Ar number , |
| where |
| .Ar base |
| is a decimal integer specifying the base (up to 36), and |
| .Ar number |
| is a number in the specified base. |
| Additionally, base-16 integers may be specified by prefixing them with |
| .Dq Li 0x |
| .Pq case-insensitive |
| in all forms of arithmetic expressions, except as numeric arguments to the |
| .Ic test |
| built-in utility. |
| Prefixing numbers with a sole digit zero |
| .Pq Dq Li 0 |
| does not cause interpretation as octal (except in POSIX mode, |
| as required by the standard), as that's unsafe to do. |
| .Pp |
| As a special |
| .Nm mksh |
| extension, numbers to the base of one are treated as either (8-bit |
| transparent) ASCII or Universal Coded Character Set codepoints, |
| depending on the shell's |
| .Ic utf8\-mode |
| flag (current setting). |
| The |
| .At |
| .Nm ksh93 |
| syntax of |
| .Dq Li \*(aqx\*(aq |
| instead of |
| .Dq Li 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 |
| .Sq Li 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 |
| .Ic read Fl a ) |
| must validate the input first. |
| See |
| .Sx CAVEATS |
| for UTF-8 mode handling. |
| .Pp |
| The operators are evaluated as follows: |
| .Bl -tag -width Ds -offset indent |
| .It unary + |
| Result is the argument (included for completeness). |
| .It unary \- |
| Negation. |
| .It \&! |
| Logical NOT; |
| the result is 1 if argument is zero, 0 if not. |
| .It \*(TI |
| Arithmetic (bit-wise) NOT. |
| .It ++ |
| 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 incremented value of the parameter; when used as a postfix operator, the |
| result is the original value of the parameter. |
| .It \-\- |
| Similar to |
| .Ic ++ , |
| except the parameter is decremented by 1. |
| .It \&, |
| 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. |
| .It = |
| Assignment; the variable on the left is set to the value on the right. |
| .It Xo |
| .No += \-= *= /= %= \*(Lt\*(Lt= \*(Gt\*(Gt= |
| .No \*(ha\*(Lt= \*(ha\*(Gt= &= \*(ha= \*(Ba= |
| .Xc |
| Assignment operators. |
| .Sm off |
| .Ao Ar var Ac Xo |
| .Aq Ar op |
| .No = Aq Ar expr |
| .Xc |
| .Sm on |
| is the same as |
| .Sm off |
| .Ao Ar var Ac Xo |
| .No = Aq Ar var |
| .Aq Ar op |
| .Aq Ar expr , |
| .Xc |
| .Sm on |
| with any operator precedence in |
| .Aq Ar expr |
| preserved. |
| For example, |
| .Dq Li var1 *= 5 + 3 |
| is the same as specifying |
| .Dq Li var1 = var1 * (5 + 3) . |
| .It \*(Ba\*(Ba |
| 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. |
| .It && |
| 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. |
| .It \*(Ba |
| Arithmetic (bit-wise) OR. |
| .It \*(ha |
| Arithmetic (bit-wise) XOR |
| (exclusive-OR). |
| .It & |
| Arithmetic (bit-wise) AND. |
| .It == |
| Equal; the result is 1 if both arguments are equal, 0 if not. |
| .It != |
| Not equal; the result is 0 if both arguments are equal, 1 if not. |
| .It \*(Lt |
| Less than; the result is 1 if the left argument is less than the right, 0 if |
| not. |
| .It \*(Lt= \*(Gt \*(Gt= |
| Less than or equal, greater than, greater than or equal. |
| See |
| .Ic \*(Lt . |
| .It \*(Lt\*(Lt \*(Gt\*(Gt |
| 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. |
| .It \*(ha\*(Lt \*(ha\*(Gt |
| Rotate left (right); the result is similar to shift, |
| except that the bits shifted out at one end are shifted in |
| at the other end, instead of zero or sign bits. |
| .It + \- * / |
| Addition, subtraction, multiplication and division. |
| .It % |
| Remainder; the result is the symmetric remainder of the division of the left |
| argument by the right. |
| To get the mathematical modulus of |
| .Dq a Ic mod No b , |
| use the formula |
| .Do |
| .Pq a % b + b |
| .No % b |
| .Dc . |
| .It Xo |
| .Sm off |
| .Aq Ar arg1 ? |
| .Aq Ar arg2 : |
| .Aq Ar arg3 |
| .Sm on |
| .Xc |
| If |
| .Aq Ar arg1 |
| is non-zero, the result is |
| .Aq Ar arg2 ; |
| otherwise the result is |
| .Aq Ar arg3 . |
| The non-result argument is not evaluated. |
| .El |
| .Ss Co-processes |
| A co-process (which is a pipeline created with the |
| .Dq Li \*(Ba& |
| operator) is an asynchronous process that the shell can both write to (using |
| .Ic print Fl p ) |
| and read from (using |
| .Ic read Fl p ) . |
| The input and output of the co-process can also be manipulated using |
| .Ic \*(Gt&p |
| and |
| .Ic \*(Lt&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 |
| .Ic exec Ar n Ns Ic \*(Gt&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 |
| .Ic exec Ar n Ns Ic \*(Lt&p |
| redirection. |
| .Pp |
| Some notes concerning co-processes: |
| .Bl -bullet |
| .It |
| 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: |
| .Ic exec 3\*(Gt&p; exec 3\*(Gt&\- |
| .It |
| 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) exits. |
| .It |
| .Ic print Fl p |
| will ignore |
| .Dv 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 |
| .Ic print Fl u Ns Ar n |
| is used. |
| .El |
| .Ss Functions |
| Functions are defined using either Korn shell |
| .Ic function Ar function-name |
| syntax or the Bourne/POSIX shell |
| .Ar function-name Ns \&() |
| syntax (see below for the difference between the two forms). |
| Functions are like |
| .Li .\(hyscripts |
| (i.e. scripts sourced using the |
| .Dq Li \&. |
| built-in) |
| in that they are executed in the current environment. |
| However, unlike |
| .Li .\(hyscripts , |
| shell arguments (i.e. positional parameters $1, $2, etc.)\& |
| are never visible inside them. |
| When the shell is determining the location of a command, functions |
| are searched after special built-in commands, before builtins and the |
| .Ev PATH |
| is searched. |
| .Pp |
| An existing function may be deleted using |
| .Ic unset Fl f Ar function-name . |
| A list of functions can be obtained using |
| .Ic typeset +f |
| and the function definitions can be listed using |
| .Ic typeset Fl f . |
| The |
| .Ic autoload |
| command (which is an alias for |
| .Ic typeset Fl fu ) |
| may be used to create undefined functions: when an undefined function is |
| executed, the shell searches the path specified in the |
| .Ev 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 executed; otherwise, the normal command search is |
| continued (i.e. the shell searches the regular built-in command table and |
| .Ev PATH ) . |
| Note that if a command is not found using |
| .Ev PATH , |
| an attempt is made to autoload a function using |
| .Ev FPATH |
| (this is an undocumented feature of the original Korn shell). |
| .Pp |
| Functions can have two attributes, |
| .Dq trace |
| and |
| .Dq export , |
| which can be set with |
| .Ic typeset Fl ft |
| and |
| .Ic typeset Fl fx , |
| respectively. |
| When a traced function is executed, the shell's |
| .Ic xtrace |
| option is turned on for the function's duration. |
| The |
| .Dq export |
| attribute of functions is currently not used. |
| .Pp |
| Since functions are executed in the current shell environment, parameter |
| assignments made inside functions are visible after the function completes. |
| If this is not the desired effect, the |
| .Ic typeset |
| command can be used inside a function to create a local parameter. |
| Note that |
| .At |
| .Nm ksh93 |
| uses static scoping (one global scope, one local scope per function) |
| and allows local variables only on Korn style functions, whereas |
| .Nm mksh |
| uses dynamic scoping (nested scopes of varying locality). |
| Note that special parameters (e.g.\& |
| .Ic \&$$ , $! ) |
| can't be scoped in this way. |
| .Pp |
| 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 |
| .Ic return |
| command; this may also be used to explicitly specify the exit status. |
| Note that when called in a subshell, |
| .Ic return |
| will only exit that subshell and will not cause the original shell to exit |
| a running function (see the |
| .Ic while Ns Li \&... Ns Ic read |
| loop FAQ). |
| .Pp |
| Functions defined with the |
| .Ic function |
| reserved word are treated differently in the following ways from functions |
| defined with the |
| .Ic \&() |
| notation: |
| .Bl -bullet |
| .It |
| The $0 parameter is set to the name of the function |
| (Bourne-style functions leave $0 untouched). |
| .It |
| .Ev OPTIND |
| is saved/reset and restored on entry and exit from the function so |
| .Ic getopts |
| can be used properly both inside and outside the function (Bourne-style |
| functions leave |
| .Ev OPTIND |
| untouched, so using |
| .Ic getopts |
| inside a function interferes with using |
| .Ic getopts |
| outside the function). |
| .It |
| Shell options |
| .Pq Ic set Fl o |
| have local scope, i.e. changes inside a function are reset upon its exit. |
| .El |
| .Pp |
| In the future, the following differences may also be added: |
| .Bl -bullet |
| .It |
| A separate trap/signal environment will be used during the execution 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. |
| .It |
| The EXIT trap, if set in a function, will be executed after the function |
| returns. |
| .El |
| .Ss Command execution |
| After evaluation of command-line arguments, redirections and parameter |
| assignments, the type of command is determined: a special built-in command, |
| a function, a normal builtin or the name of a file to execute found using the |
| .Ev PATH |
| parameter. |
| The checks are made in the above order. |
| Special built-in commands differ from other commands in that the |
| .Ev PATH |
| parameter is not used to find them, an error during their execution can |
| cause a non-interactive shell to exit, and parameter assignments that are |
| specified before the command are kept after the command completes. |
| Regular built-in commands are different only in that the |
| .Ev PATH |
| parameter is not used to find them. |
| .Pp |
| POSIX special built-in utilities: |
| .Pp |
| .Ic \&. , \&: , break , continue , |
| .Ic eval , exec , exit , export , |
| .Ic readonly , return , set , shift , |
| .Ic times , trap , unset |
| .Pp |
| Additional |
| .Nm |
| commands keeping assignments: |
| .Pp |
| .Ic source , typeset |
| .Pp |
| All other builtins are not special; these are at least: |
| .Pp |
| .Ic [\& , alias , bg , bind , |
| .Ic builtin , cat , cd , command , |
| .Ic echo , false , fc , fg , |
| .Ic getopts , jobs , kill , let , |
| .Ic print , pwd , read , realpath , |
| .Ic rename , sleep , suspend , test , |
| .Ic true , ulimit , umask , unalias , |
| .Ic wait , whence |
| .Pp |
| Once the type of command has been determined, any command-line parameter |
| assignments are performed and exported for the duration of the command. |
| .Pp |
| The following describes the special and regular built-in commands and |
| builtin-like reserved words, as well as some optional utilities: |
| .Pp |
| .Bl -tag -width false -compact |
| .It Ic \&. Ar file Op Ar arg ... |
| .Pq keeps assignments , special |
| This is called the |
| .Dq dot |
| command. |
| Execute the commands in |
| .Ar file |
| in the current environment. |
| The file is searched for in the directories of |
| .Ev PATH . |
| If arguments are given, the positional parameters may be used to access them |
| while |
| .Ar file |
| is being executed. |
| If no arguments are given, the positional parameters are |
| those of the environment the command is used in. |
| .Pp |
| .It Ic \&: Op Ar ... |
| .Pq keeps assignments , special |
| The null command. |
| .br |
| Exit status is set to zero. |
| .Pp |
| .It Ic Lb64decode Op Ar string |
| .Pq Li dot.mkshrc No function |
| Decode |
| .Ar string |
| or standard input to binary. |
| .Pp |
| .It Ic Lb64encode Op Ar string |
| .Pq Li dot.mkshrc No function |
| Encode |
| .Ar string |
| or standard input as base64. |
| .Pp |
| .It Ic Lbafh_init |
| .It Ic Lbafh_add Op Ar string |
| .It Ic Lbafh_finish |
| .Pq Li dot.mkshrc No functions |
| Implement the Better Avalance for the Jenkins Hash. |
| This is the same hash |
| .Nm |
| currently uses internally. |
| .No "After calling" Ic Lbafh_init , No call Ic Lbafh_add |
| multiple times until all input is read, then call |
| .Ic Lbafh_finish , |
| which writes the result to the unsigned integer |
| .Va Lbafh_v |
| variable for your consumption. |
| .Pp |
| .It Ic Lstripcom Op Ar |
| .Pq Li dot.mkshrc No function |
| Same as |
| .Ic cat |
| but strips any empty lines and comments (from any |
| .Sq # |
| character onwards, no escapes) |
| and reduces any amount of whitespace to one space character. |
| .Pp |
| .It Ic \&[ Ar expression Ic \&] |
| .Pq regular |
| See |
| .Ic test . |
| .Pp |
| .It Xo Ic alias |
| .Oo Fl d \*(Ba t Oo Fl r Oc \*(Ba |
| .Fl +x Oc |
| .Op Fl p |
| .Op Cm + |
| .Oo Ar name |
| .Op Ns = Ns Ar value |
| .Ar ... Oc |
| .Xc |
| .Pq regular |
| Without arguments, |
| .Ic alias |
| lists all aliases. |
| For any name without a value, the existing alias is listed. |
| Any name with a value defines an alias; see |
| .Sx Aliases |
| above. |
| .Li \&[][A\-Za\-z0\-9_!%+,.@:\-] |
| are valid in names, except they may not begin with a plus or hyphen-minus, and |
| .Ic \&[[ |
| is not a valid alias name. |
| .Pp |
| When listing aliases, one of two formats is used. |
| Normally, aliases are listed as |
| .Ar name Ns = Ns Ar value , |
| where |
| .Ar value |
| is quoted as necessary. |
| If options were preceded with |
| .Ql + , |
| or a lone |
| .Ql + |
| is given on the command line, only |
| .Ar name |
| is printed. |
| .Pp |
| The |
| .Fl d |
| option causes directory aliases which are used in tilde expansion to be |
| listed or set (see |
| .Sx Tilde expansion |
| above). |
| .Pp |
| With |
| .Fl p , |
| each alias is listed with the string |
| .Dq Li alias\ \& |
| prefixed. |
| .Pp |
| The |
| .Fl t |
| option indicates that tracked aliases are to be listed/set (values given |
| with the command are ignored for tracked aliases). |
| .Pp |
| The |
| .Fl r |
| option indicates that all tracked aliases are to be reset. |
| .Pp |
| The |
| .Fl x |
| option sets |
| .Pq Ic +x No clears |
| the export attribute of an alias, or, if no names are given, lists the aliases |
| with the export attribute (exporting an alias has no effect). |
| .Pp |
| .It Ic autoload |
| .Pq built-in alias |
| See |
| .Sx Functions |
| above. |
| .Pp |
| .It Ic bg Op Ar job ... |
| .Pq regular , needs job control |
| Resume the specified stopped job(s) in the background. |
| If no jobs are specified, |
| .Ic %+ |
| is assumed. |
| See |
| .Sx Job control |
| below for more information. |
| .Pp |
| .It Ic bind Fl l |
| .Pq regular |
| The names of editing commands strings can be bound to are listed. |
| See |
| .Sx Emacs editing mode |
| for more information. |
| .Pp |
| .It Ic bind Op Ar string ... |
| The current bindings, for |
| .Ar string , |
| if given, else all, are listed. |
| .Em Note: |
| Default prefix bindings |
| .Pq 1=Esc , 2=\*(haX , 3=NUL |
| assumed. |
| .Pp |
| .It Xo Ic bind |
| .Ar string Ns = Ns Op Ar editing-command |
| .Op Ar ... |
| .Xc |
| .It Xo Ic bind Fl m |
| .Ar string Ns = Ns Ar substitute |
| .Op Ar ... |
| .Xc |
| To |
| .Ar string , |
| which should consist of a control character |
| optionally preceded by one of the three prefix characters |
| and optionally succeeded by a tilde character, the |
| .Ar editing-command |
| is bound so that future input of the |
| .Ar string |
| will immediately invoke that editing command. |
| If a tilde postfix is given, a tilde trailing the control character is ignored. |
| If |
| .Fl m |
| .Pq macro |
| is given, future input of the |
| .Ar string |
| will be replaced by the given NUL-terminated |
| .Ar substitute |
| string, wherein prefix/control/tilde characters mapped to editing commands |
| .Pq but not those mapped to other macros |
| will be processed. |
| .Pp |
| Prefix and control characters may be written using caret notation, i.e.\& |
| .No \*(ha Ns Li Z |
| represents |
| .No Ctrl- Ns Li Z . |
| Use a backslash to escape the caret, an equals sign or another backslash. |
| Note that, although only three prefix characters |
| .Pq usually Esc, \*(haX and NUL |
| are supported, some multi-character sequences can be supported. |
| .Pp |
| .It Ic break Op Ar level |
| .Pq keeps assignments , special |
| Exit the |
| .Ar level Ns th |
| inner-most |
| .Ic for , |
| .Ic select , |
| .Ic until |
| or |
| .Ic while |
| loop. |
| .Ar level |
| defaults to 1. |
| .Pp |
| .It Xo |
| .Ic builtin |
| .Op Fl \- |
| .Ar command Op Ar arg ... |
| .Xc |
| .Pq regular |
| Execute the built-in command |
| .Ar command . |
| .Pp |
| .It Xo |
| .Ic \ebuiltin |
| .Ar command Op Ar arg ... |
| .Xc |
| .Pq regular , decl-forwarder |
| Same as |
| .Ic builtin . |
| Additionally acts as declaration utility forwarder, i.e. this is a |
| declaration utility (see |
| .Sx Tilde expansion ) |
| .No iff Ar command |
| is a declaration utility. |
| .Pp |
| .It Xo |
| .Ic cat |
| .Op Fl u |
| .Op Ar |
| .Xc |
| .Pq defer with flags |
| Copy files in command line order to standard output. |
| If a |
| .Ar file |
| is a single dash |
| .Pq Dq Li \- |
| or absent, read from standard input. |
| For direct builtin calls, the |
| .Tn POSIX |
| .Fl u |
| option is supported as a no-op. |
| For calls from shell, if any options are given, an external |
| .Xr cat 1 |
| utility is preferred over the builtin. |
| .Pp |
| .It Xo |
| .Ic cd |
| .Op Fl L |
| .Op Ar dir |
| .Xc |
| .It Xo |
| .Ic cd |
| .Fl P Op Fl e |
| .Op Ar dir |
| .Xc |
| .It Xo |
| .Ic chdir |
| .Op Fl eLP |
| .Op Ar dir |
| .Xc |
| .Pq regular |
| Set the working directory to |
| .Ar dir . |
| If the parameter |
| .Ev CDPATH |
| is set, it lists the search path for the directory containing |
| .Ar dir . |
| An unset or empty path means the current directory. |
| If |
| .Ar dir |
| is found in any component of the |
| .Ev CDPATH |
| search path other than an unset or empty path, |
| the name of the new working directory will be written to standard output. |
| If |
| .Ar dir |
| is missing, the home directory |
| .Ev HOME |
| is used. |
| If |
| .Ar dir |
| is |
| .Dq Li \- , |
| the previous working directory is used (see the |
| .Ev OLDPWD |
| parameter). |
| .Pp |
| If the |
| .Fl L |
| option (logical path) is used or if the |
| .Ic physical |
| option isn't set (see the |
| .Ic set |
| command below), references to |
| .Dq Li .. |
| in |
| .Ar dir |
| are relative to the path used to get to the directory. |
| If the |
| .Fl P |
| option (physical path) is used or if the |
| .Ic physical |
| option is set, |
| .Dq Li .. |
| is relative to the filesystem directory tree. |
| The |
| .Ev PWD |
| and |
| .Ev OLDPWD |
| parameters are updated to reflect the current and old working directory, |
| respectively. |
| If the |
| .Fl e |
| option is set for physical filesystem traversal and |
| .Ev PWD |
| could not be set, the exit code is 1; greater than 1 if an |
| error occurred, 0 otherwise. |
| .Pp |
| .It Xo |
| .Ic cd |
| .Op Fl eLP |
| .Ar old new |
| .Xc |
| .It Xo |
| .Ic chdir |
| .Op Fl eLP |
| .Ar old new |
| .Xc |
| .Pq regular |
| The string |
| .Ar new |
| is substituted for |
| .Ar old |
| in the current directory, and the shell attempts to change to the new |
| directory. |
| .Pp |
| .It Ic cls |
| .Pq Li dot.mkshrc No alias |
| Reinitialise the display (hard reset). |
| .Pp |
| .It Xo |
| .Ic command |
| .Op Fl pVv |
| .Ar cmd |
| .Op Ar arg ... |
| .Xc |
| .Pq regular , decl-forwarder |
| If neither the |
| .Fl v |
| nor |
| .Fl V |
| option is given, |
| .Ar cmd |
| is executed exactly as if |
| .Ic command |
| had not been specified, with two exceptions: |
| firstly, |
| .Ar cmd |
| cannot be a shell function; |
| and secondly, special built-in commands lose their specialness |
| (i.e. redirection and utility errors do not cause the shell to |
| exit, and command assignments are not permanent). |
| .Pp |
| If the |
| .Fl p |
| option is given, a default search path, whose actual value is |
| system-dependent, is used instead of the current |
| .Ev PATH . |
| .Pp |
| If the |
| .Fl v |
| option is given, instead of executing |
| .Ar 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 |
| .Ev 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 |
| .Ic command |
| exits with a non-zero status. |
| The |
| .Fl V |
| option is like the |
| .Fl v |
| option, but more verbose. |
| .Pp |
| .It Ic continue Op Ar level |
| .Pq keeps assignments , special |
| Jumps to the beginning of the |
| .Ar level Ns th |
| inner-most |
| .Ic for , |
| .Ic select , |
| .Ic until |
| or |
| .Ic while |
| loop. |
| .Ar level |
| defaults to 1. |
| .Pp |
| .It Ic dirs Op Fl lnv |
| .Pq Li dot.mkshrc No function |
| Print the directory stack. |
| .Fl l |
| causes tilde expansion to occur in the output. |
| .Fl n |
| causes line wrapping before 80 columns, whereas |
| .Fl v |
| causes numbered vertical output. |
| .Pp |
| .It Ic doch |
| .Pq Li dot.mkshrc No alias |
| Execute the last command with |
| .Xr sudo 8 . |
| .Pp |
| .It Xo |
| .Ic echo |
| .Op Fl Een |
| .Op Ar arg ... |
| .Xc |
| .Pq regular |
| .Em Warning: |
| this utility is not portable; use the standard Korn shell built-in utility |
| .Ic print |
| in new code instead. |
| .Pp |
| Print arguments, separated by spaces, followed by a newline, to |
| standard output. |
| The newline is suppressed if any of the arguments contain the |
| backslash sequence |
| .Dq Li \ec . |
| See the |
| .Ic print |
| command below for a list of other backslash sequences that are recognised. |
| .Pp |
| The options are provided for compatibility with |
| .Bx |
| shell scripts. |
| The |
| .Fl E |
| option suppresses backslash interpretation, |
| .Fl e |
| enables it (normally default), |
| .Fl n |
| suppresses the trailing newline, |
| and anything else causes the word to be printed as argument instead. |
| .Pp |
| If the |
| .Ic posix |
| or |
| .Ic sh |
| option is set or this is a direct builtin call or |
| .Ic print |
| .Fl R , |
| only the first argument is treated as an option, and only if it is exactly |
| .Dq Li \-n . |
| Backslash interpretation is disabled. |
| .Pp |
| .It Xo |
| .Ic enable |
| .Op Fl anps |
| .Op Ar name ... |
| .Xc |
| .Pq Li dot.mkshrc No function |
| Hide and unhide built-in utilities, aliases and functions and those defined in |
| .Li dot.mkshrc . |
| .Pp |
| If no |
| .Ar name |
| is given or the |
| .Fl p |
| option is used, builtins are printed (behind the string |
| .Dq Li enable\ \& , |
| followed by |
| .Dq Li \-n\ \& |
| if the builtin is currently disabled), otherwise, they are disabled (if |
| .Fl n |
| is given) or re-enabled. |
| .Pp |
| When printing, only enabled builtins are printed by default; the |
| .Fl a |
| options prints all builtins, while |
| .Fl n |
| prints only disabled builtins instead; |
| .Fl s |
| limits the list to POSIX special builtins. |
| .Pp |
| .It Ic eval Ar command ... |
| .Pq 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 environment. |
| .Pp |
| .It Xo |
| .Ic exec |
| .Op Fl a Ar argv0 |
| .Op Fl c |
| .Op Ar command Op Ar arg ... |
| .Xc |
| .Pq keeps assignments , special |
| The command (with arguments) is executed without forking, |
| fully replacing the shell process; this is absolute, i.e.\& |
| .Ic exec |
| never returns, even if the |
| .Ar command |
| is not found. |
| The |
| .Fl a |
| option permits setting a different |
| .Li argv[0] |
| value, and |
| .Fl c |
| clears the environment before executing the child process, except for the |
| .Ev _ |
| parameter and direct assignments. |
| .Pp |
| If no command is given except for I/O redirection, the I/O redirection is |
| permanent and the shell is |
| not replaced. |
| Any file descriptors greater than 2 which are opened or |
| .Xr dup 2 Ns 'd |
| in this way are not made available to other executed commands (i.e. commands |
| that are not built-in to the shell). |
| Note that the Bourne shell differs here; |
| it does pass these file descriptors on. |
| .Pp |
| .It Ic exit Op Ar status |
| .Pq keeps assignments , special |
| The shell or subshell exits with the specified errorlevel |
| (or the current value of the |
| .Va $?\& |
| parameter). |
| .Pp |
| .It Xo |
| .Ic export |
| .Op Fl p |
| .Op Ar parameter Ns Op = Ns Ar value |
| .Xc |
| .Pq keeps assignments , special, decl-util |
| Sets the export attribute of the named parameters. |
| Exported parameters are passed in the environment to executed commands. |
| If values are specified, the named parameters are also assigned. |
| This is a declaration utility. |
| .Pp |
| If no parameters are specified, all parameters with the export attribute |
| set are printed one per line: either their names, or, if a |
| .Dq Li \- |
| with no option letter is specified, name=value pairs, or, with the |
| .Fl p |
| option, |
| .Ic export |
| commands suitable for re-entry. |
| .Pp |
| .It Ic extproc |
| .Pq OS/2 |
| Null command required for shebang-like functionality. |
| .Pp |
| .It Ic false |
| .Pq regular |
| A command that exits with a non-zero status. |
| .Pp |
| .It Xo |
| .Ic fc |
| .Oo Fl e Ar editor \*(Ba |
| .Fl l Op Fl n Oc |
| .Op Fl r |
| .Op Ar first Op Ar last |
| .Xc |
| .Pq regular |
| .Ar first |
| and |
| .Ar last |
| select commands from the history. |
| Commands can be selected by history number |
| (negative numbers go backwards from the current, most recent, line) |
| or a string specifying the most recent command starting with that string. |
| The |
| .Fl l |
| option lists the command on standard output, and |
| .Fl n |
| inhibits the default command numbers. |
| The |
| .Fl r |
| option reverses the order of the list. |
| Without |
| .Fl l , |
| the selected commands are edited by the editor specified with the |
| .Fl e |
| option or, if no |
| .Fl e |
| is specified, the editor specified by the |
| .Ev FCEDIT |
| parameter (if this parameter is not set, |
| .Pa /bin/ed |
| is used), and the result is executed by the shell. |
| .Pp |
| .It Xo |
| .Ic fc |
| .Cm \-e \- \*(Ba Fl s |
| .Op Fl g |
| .Op Ar old Ns = Ns Ar new |
| .Op Ar prefix |
| .Xc |
| .Pq regular |
| Re-execute the selected command (the previous command by default) after |
| performing the optional substitution of |
| .Ar old |
| with |
| .Ar new . |
| If |
| .Fl g |
| is specified, all occurrences of |
| .Ar old |
| are replaced with |
| .Ar new . |
| The meaning of |
| .Cm \-e \- |
| and |
| .Fl s |
| is identical: re-execute the selected command without invoking an editor. |
| This command is usually accessed with the predefined: |
| .Ic alias r=\*(aqfc \-e \-\*(aq |
| .Pp |
| .It Ic fg Op Ar job ... |
| .Pq regular , needs job control |
| Resume the specified job(s) in the foreground. |
| If no jobs are specified, |
| .Ic %+ |
| is assumed. |
| .br |
| See |
| .Sx Job control |
| below for more information. |
| .Pp |
| .It Ic functions Op Ar name ... |
| .Pq built-in alias |
| Display the function definition commands corresponding to the listed, |
| or all defined, functions. |
| .Pp |
| .It Xo |
| .Ic getopts |
| .Ar optstring name |
| .Op Ar arg ... |
| .Xc |
| .Pq regular |
| Used by shell procedures to parse the specified arguments (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 argument 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. |
| .Pp |
| .Ar optstring |
| contains the option letters to be recognised. |
| If a letter is followed by a colon, the option takes an argument. |
| .Pp |
| Each time |
| .Ic getopts |
| is invoked, it places the next option in the shell parameter |
| .Ar name . |
| If the option was introduced with a |
| .Ql + , |
| the character placed in |
| .Ar name |
| is prefixed with a |
| .Ql + . |
| If the option takes an argument, it is placed in the shell parameter |
| .Ev OPTARG. |
| .Pp |
| When an illegal option or a missing option argument is encountered, a question |
| mark or a colon is placed in |
| .Ar name |
| (indicating an illegal option or missing argument, respectively) and |
| .Ev OPTARG |
| is set to the option letter that caused the problem. |
| Furthermore, unless |
| .Ar optstring |
| begins with a colon, a question mark is placed in |
| .Ar name , |
| .Ev OPTARG |
| is unset and a diagnostic is shown on standard error. |
| .Pp |
| .Ic getopts |
| records the index of the argument to be processed by the next call in |
| .Ev OPTIND . |
| When the end of the options is encountered, |
| .Ic getopts |
| returns a non-zero exit status. |
| Options end at the first argument that does not start with a |
| .Ql \- |
| .Pq non-option argument |
| or when a |
| .Dq Li \-\- |
| argument is encountered. |
| .Pp |
| Option parsing can be reset by setting |
| .Ev OPTIND |
| to 1 (this is done automatically whenever the shell or a shell procedure is |
| invoked). |
| .Pp |
| .Em Warning: |
| Changing the value of the shell parameter |
| .Ev OPTIND |
| to a value other than 1 or parsing different sets of arguments without |
| resetting |
| .Ev OPTIND |
| may lead to unexpected results. |
| .Pp |
| .It Xo |
| .Ic hash |
| .Op Fl r |
| .Op Ar name ... |
| .Xc |
| .Pq built-in alias |
| Without arguments, any hashed executable command paths are listed. |
| The |
| .Fl r |
| option causes all hashed commands to be removed from the cache. |
| Each |
| .Ar name |
| is searched as if it were a command name |
| and added to the cache if it is an executable command. |
| .Pp |
| .It Ic hd Op Ar |
| .Pq Li dot.mkshrc No alias or function |
| Hexdump stdin or arguments legibly. |
| .Pp |
| .It Xo |
| .Ic history |
| .Op Fl nr |
| .Op Ar first Op Ar last |
| .Xc |
| .Pq built-in alias |
| Same as |
| .Ic fc Fl l Pq see above . |
| .Pp |
| .It Xo |
| .Ic integer |
| .Op flags |
| .Oo Ar name |
| .Op Ns = Ns Ar value |
| .Ar ... Oc |
| .Xc |
| .Pq built-in alias |
| Same as |
| .Ic typeset Fl i Pq see below . |
| .Pp |
| .It Xo |
| .Ic jobs |
| .Op Fl lnp |
| .Op Ar job ... |
| .Xc |
| .Pq regular |
| Display information about the specified job(s); if no jobs are specified, all |
| jobs are displayed. |
| The |
| .Fl n |
| option causes information to be displayed only for jobs that have changed |
| state since the last notification. |
| If the |
| .Fl l |
| option is used, the process ID of each process in a job is also listed. |
| The |
| .Fl p |
| option causes only the process group of each job to be printed. |
| See |
| .Sx Job control |
| below for the format of |
| .Ar job |
| and the displayed job. |
| .Pp |
| .It Xo |
| .Ic kill |
| .Oo Fl s Ar signame \*(Ba |
| .No \- Ns Ar signum \*(Ba |
| .No \- Ns Ar signame Oc |
| .No { Ar job \*(Ba pid \*(Ba pgrp No } |
| .Ar ... |
| .Xc |
| .Pq regular |
| Send the specified signal to the specified jobs, process IDs or process |
| groups. |
| If no signal is specified, the |
| .Dv TERM |
| signal is sent. |
| If a job is specified, the signal is sent to the job's process group. |
| See |
| .Sx Job control |
| below for the format of |
| .Ar job . |
| .Pp |
| .It Xo |
| .Ic kill |
| .Fl l |
| .Op Ar exit-status ... |
| .Xc |
| .Pq regular |
| Print the signal name corresponding to |
| .Ar exit-status . |
| If no arguments are specified, a list of all the signals with their numbers |
| and a short description of each are printed. |
| .Pp |
| .It Ic let Op Ar expression ... |
| .Pq regular |
| Each expression is evaluated (see |
| .Sx 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 evaluation of an expression, the exit status is greater than 1. |
| Since expressions may need to be quoted, |
| .Li \&(( Ar expr Li )) |
| is syntactic sugar for: |
| .Dl "{ \e\ebuiltin let \*(aq" Ns Ar expr Ns Li "\*(aq; }" |
| .Pp |
| .It Xo |
| .Ic local |
| .Op flags |
| .Oo Ar name |
| .Op Ns = Ns Ar value |
| .Ar ... Oc |
| .Xc |
| .Pq built-in alias |
| Same as |
| .Ic typeset Pq see below . |
| .Pp |
| .It Xo |
| .Ic mknod |
| .Op Fl m Ar mode |
| .Ar name |
| .Cm b\*(Bac |
| .Ar major minor |
| .Xc |
| .It Xo |
| .Ic mknod |
| .Op Fl m Ar mode |
| .Ar name |
| .Cm p |
| .Xc |
| .Pq optional |
| Create a device special file. |
| The file type may be one of |
| .Cm b |
| (block type device), |
| .Cm c |
| (character type device) |
| or |
| .Cm p |
| .Pq named pipe , Tn FIFO . |
| The file created may be modified according to its |
| .Ar mode |
| (via the |
| .Fl m |
| option), |
| .Ar major |
| (major device number), |
| and |
| .Ar minor |
| (minor device number). |
| This is not normally part of |
| .Nm mksh ; |
| however, distributors may have added this as builtin as a speed hack. |
| .Pp |
| .It Xo |
| .Ic nameref |
| .Op flags |
| .Oo Ar name |
| .Op Ns = Ns Ar value |
| .Ar ... Oc |
| .Xc |
| .Pq built-in alias |
| Same as |
| .Ic typeset Fl n Pq see below . |
| .Pp |
| .It Xo |
| .Ic popd |
| .Op Fl lnv |
| .Op Ic + Ns Ar n |
| .Xc |
| .Pq Li dot.mkshrc No function |
| Pops the directory stack and returns to the new top directory. |
| The flags are as in |
| .Ic dirs Pq see above . |
| A numeric argument |
| .Ic + Ns Ar n |
| selects the entry in the stack to discard. |
| .Pp |
| .It Xo |
| .Ic print |
| .Oo Fl AcelNnprsu Ns Oo Ar n Oc \*(Ba |
| .Fl R Op Fl n Oc |
| .Op Ar argument ... |
| .Xc |
| .Pq regular |
| Print the specified argument(s) on the standard output, |
| separated by spaces, terminated with a newline. |
| The escapes mentioned in |
| .Sx Backslash expansion |
| above, as well as |
| .Dq Li \ec , |
| which is equivalent to using the |
| .Fl n |
| option, are interpreted. |
| .Pp |
| The options are as follows: |
| .Bl -tag -width XuXnX |
| .It Fl A |
| Each |
| .Ar argument |
| is arithmetically evaluated; the character corresponding to the |
| resulting value is printed. |
| Empty |
| .Ar argument Ns s |
| separate input words. |
| .It Fl c |
| The output is printed columnised, line by line, similar to how the |
| .Xr rs 1 |
| utility, tab completion, the |
| .Ic kill Fl l |
| built-in utility and the |
| .Ic select |
| statement do. |
| .It Fl e |
| Restore backslash expansion after a previous |
| .Fl r . |
| .It Fl l |
| Change the output word separator to newline. |
| .It Fl N |
| Change the output word and line separator to ASCII NUL. |
| .It Fl n |
| Do not print the trailing line separator. |
| .It Fl p |
| Print to the co-process (see |
| .Sx Co-processes |
| above). |
| .It Fl r |
| Inhibit backslash expansion. |
| .It Fl s |
| Print to the history file instead of standard output. |
| .It Fl u Ns Op Ar n |
| Print to the file descriptor |
| .Ar n Pq defaults to 1 if omitted |
| instead of standard output. |
| .El |
| .Pp |
| The |
| .Fl R |
| option mostly emulates the |
| .Bx |
| .Xr echo 1 |
| command which does not expand backslashes and interprets |
| its first argument as option only if it is exactly |
| .Dq Li \-n |
| .Pq to suppress the trailing newline . |
| .Pp |
| .It Ic printf Ar format Op Ar arguments ... |
| .Pq optional , defer always |
| If compiled in, format and print the arguments, supporting the bare |
| .Tn POSIX Ns -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 |
| .Ic builtin |
| utility. |
| .Pp |
| .It Ic pushd Op Fl lnv |
| .Pq Li dot.mkshrc No function |
| Rotate the top two elements of the directory stack. |
| The options are the same as for |
| .Ic dirs Pq see above , |
| and |
| .Ic pushd |
| changes to the topmost directory stack entry after acting. |
| .Pp |
| .It Xo |
| .Ic pushd |
| .Op Fl lnv |
| .Ic + Ns Ar n |
| .Xc |
| .Pq Li dot.mkshrc No function |
| Rotate the element number |
| .Ar n |
| to the top. |
| .Pp |
| .It Xo |
| .Ic pushd |
| .Op Fl lnv |
| .Ar name |
| .Xc |
| .Pq Li dot.mkshrc No function |
| Push |
| .Ar name |
| on top of the stack. |
| .Pp |
| .It Ic pwd Op Fl LP |
| .Pq regular |
| Print the present working directory. |
| If no options are given, |
| .Ic pwd |
| behaves as if the |
| .Fl P |
| option (print physical path) was used if the |
| .Ic physical |
| shell option is set, the |
| .Fl L |
| option (print logical path) otherwise. |
| The logical path is the path used to |
| .Ic cd |
| to the current directory; |
| the physical path is determined from the filesystem (by following |
| .Dq Li ..\& |
| directories to the root directory). |
| .Pp |
| .It Xo |
| .Ic r |
| .Op Fl g |
| .Op Ar old Ns = Ns Ar new |
| .Op Ar prefix |
| .Xc |
| .Pq built-in alias |
| Same as |
| .Ic fc Fl e \& Pq see above . |
| .Pp |
| .It Xo |
| .Ic read |
| .Op Fl A \*(Ba Fl a |
| .Op Fl d Ar x |
| .Oo Fl N Ar z \*(Ba |
| .Fl n Ar z Oc |
| .Oo Fl p \*(Ba |
| .Fl u Ns Op Ar n |
| .Oc Op Fl t Ar n |
| .Op Fl rs |
| .Op Ar p ... |
| .Xc |
| .Pq regular |
| Reads a line of input, separates the input into fields using the |
| .Ev IFS |
| parameter (see |
| .Sx Substitution |
| above) or other specified means, |
| and assigns each field to the specified parameters |
| .Ar p . |
| If no parameters are specified, the |
| .Ev 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). |
| .Pp |
| The options are as follows: |
| .Bl -tag -width XuXnX |
| .It Fl A |
| Store the result into the parameter |
| .Ar p |
| (or |
| .Ev REPLY ) |
| as array of words. |
| Only no or one parameter is accepted. |
| .It Fl a |
| Store the result, without applying IFS word splitting, into the parameter |
| .Ar p |
| (or |
| .Ev REPLY ) |
| as array of characters (wide characters if the |
| .Ic utf8\-mode |
| option is enacted, octets otherwise); the codepoints are |
| encoded as decimal numbers by default. |
| Only no or one parameter is accepted. |
| .It Fl d Ar x |
| Use the first byte of |
| .Ar x , |
| .Dv NUL |
| if empty, instead of the ASCII newline character to delimit input lines. |
| .It Fl N Ar z |
| Instead of reading till end-of-line, read exactly |
| .Ar 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 |
| .Dv SIGALRM |
| were caught. |
| .It Fl n Ar z |
| Instead of reading till end-of-line, read up to |
| .Ar 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. |
| .It Fl p |
| Read from the currently active co-process (see |
| .Sx Co-processes |
| above for details) instead of from a file descriptor. |
| .It Fl u Ns Op Ar n |
| Read from the file descriptor number |
| .Ar n |
| (defaults to 0, i.e.\& standard input). |
| .br |
| The argument must immediately follow the option character. |
| .It Fl t Ar n |
| Interrupt reading after |
| .Ar n |
| seconds (specified as positive decimal value with an optional fractional part). |
| The exit status of |
| .Nm read |
| is the same as if |
| .Dv SIGALRM |
| were caught if the timeout occurred, but partial reads may still be returned. |
| .It Fl r |
| Normally, |
| .Ic read |
| strips backslash-newline sequences and any remaining backslashes from input. |
| This option enables raw mode, in which backslashes are retained and ignored. |
| .It Fl s |
| The input line is saved to the history. |
| .El |
| .Pp |
| If the input is a terminal, both the |
| .Fl N |
| and |
| .Fl n |
| options set it into raw mode; |
| they read an entire file if \-1 is passed as |
| .Ar z |
| argument. |
| .Pp |
| The first parameter may have a question mark and a string appended to it, in |
| which case the string is used as a prompt (printed to standard error before |
| any input is read) if the input is a |
| .Xr tty 4 |
| (e.g.\& |
| .Ic read nfoo?\*(aqnumber of foos: \*(aq ) . |
| .Pp |
| If no input is read or a timeout occurred, |
| .Ic read |
| exits with a non-zero status. |
| .Pp |
| .It Xo |
| .Ic readonly |
| .Op Fl p |
| .Oo Ar parameter |
| .Op Ns = Ns Ar value |
| .Ar ... Oc |
| .Xc |
| .Pq keeps assignments , special, decl-util |
| Sets the read-only attribute of the named parameters. |
| If values are given, |
| parameters are assigned these before disallowing writes. |
| Once a parameter is made read-only, |
| it cannot be unset and its value cannot be changed. |
| .Pp |
| If no parameters are specified, the names of all parameters with the read-only |
| attribute are printed one per line, unless the |
| .Fl p |
| option is used, in which case |
| .Ic readonly |
| commands defining all read-only parameters, including their values, are |
| printed. |
| .Pp |
| .It Xo |
| .Ic realpath |
| .Op Fl \- |
| .Ar name |
| .Xc |
| .Pq defer with flags |
| Resolves an absolute pathname corresponding to |
| .Ar name . |
| If the resolved pathname either exists or can be created immediately, |
| .Ic realpath |
| returns 0 and prints the resolved pathname, |
| otherwise or if an error occurs, it issues a diagnostic and returns nonzero. |
| If |
| .Ar name |
| ends with a slash |
| .Pq Ql / , |
| resolving to an extant non-directory is also treated as error. |
| .Pp |
| .It Xo |
| .Ic rename |
| .Op Fl \- |
| .Ar from to |
| .Xc |
| .Pq defer always |
| Renames the file |
| .Ar from |
| to |
| .Ar to . |
| Both must be complete pathnames and on the same device. |
| Intended for emergency situations |
| .Pq where Pa /bin/mv No becomes unusable ; |
| directly calls |
| .Xr rename 2 . |
| .Pp |
| .It Ic return Op Ar status |
| .Pq keeps assignments , special |
| Returns from a function or |
| .Ic \&. |
| script with errorlevel |
| .Ar status . |
| If no |
| .Ar status |
| is given, the exit status of the last executed command is used. |
| If used outside of a function or |
| .Ic \&. |
| script, it has the same effect as |
| .Ic exit . |
| Note that |
| .Nm |
| treats both profile and |
| .Ev ENV |
| files as |
| .Ic \&. |
| scripts, while the original Korn shell only treated profiles as |
| .Ic \&. |
| scripts. |
| .Pp |
| .It Ic rot13 |
| .Pq Li dot.mkshrc No alias |
| ROT13-encrypts/-decrypts stdin to stdout. |
| .Pp |
| .It Xo |
| .Ic set Op Fl +abCefhiklmnprsUuvXx |
| .Op Fl +o Ar option |
| .Op Fl +A Ar name |
| .Op Fl \- |
| .Op Ar arg ... |
| .Xc |
| .Pq keeps assignments , special |
| The |
| .Ic set |
| command can be used to show all shell parameters |
| .Pq like Ic typeset \- , |
| set |
| .Pq Ic \- |
| or clear |
| .Pq Ic + |
| shell options, set an array parameter or the positional parameters. |
| .Pp |
| Options can be changed using the |
| .Fl +o Ar option |
| syntax, where |
| .Ar option |
| is the long name of an option, or using the |
| .Fl + Ns Ar letter |
| syntax, where |
| .Ar 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 option does: |
| .Bl -tag -width 3n |
| .It Fl A Ar name |
| Sets the elements of the array parameter |
| .Ar name |
| to |
| .Ar arg ... |
| .Pp |
| If |
| .Fl A |
| is used, the array is reset (i.e. emptied) first; if |
| .Ic +A |
| is used, the first N elements are set (where N is the number of arguments); |
| the rest are left untouched. |
| If |
| .Ar name |
| ends with a |
| .Sq + , |
| the array is appended to instead. |
| .Pp |
| An alternative syntax for the command |
| .Ic set \-A foo \-\- a b c; |
| .Ic set \-A foo+ \-\- d e |
| which is compatible to |
| .Tn GNU |
| .Nm bash |
| and also supported by |
| .At |
| .Nm ksh93 |
| is: |
| .Ic foo=(a b c); foo+=(d e) |
| .It Fl a \*(Ba Fl o Ic allexport |
| All new parameters are created with the export attribute. |
| .It Fl b \*(Ba Fl o Ic notify |
| Print job notification messages asynchronously instead of just before the |
| prompt. |
| Only used with job control |
| .Pq Fl m . |
| .It Fl C \*(Ba Fl o Ic noclobber |
| Prevent \*(Gt redirection from overwriting existing files. |
| Instead, \*(Gt\*(Ba must be used to force an overwrite. |
| .Em Note: |
| This is not safe to use for creation of temporary files or |
| lockfiles due to a TOCTOU in a check allowing one to redirect output to |
| .Pa /dev/null |
| or other device files even in |
| .Ic noclobber |
| mode. |
| .It Fl e \*(Ba Fl o Ic errexit |
| Exit (after executing the |
| .Dv ERR |
| trap) as soon as an error occurs or a command fails (i.e. exits with a |
| non-zero status). |
| This does not apply to commands whose exit status is |
| explicitly tested by a shell construct such as |
| .Ic !\& , |
| .Ic if , |
| .Ic until |
| or |
| .Ic while |
| statements. |
| For |
| .Ic && , |
| .Ic \*(Ba\*(Ba |
| and pipelines (but mind |
| .Fl o Ic pipefail ) , |
| only the status of the last command is tested. |
| .It Fl f \*(Ba Fl o Ic noglob |
| Do not expand file name patterns. |
| .It Fl h \*(Ba Fl o Ic trackall |
| Create tracked aliases for all executed commands (see |
| .Sx Aliases |
| above). |
| Enabled by default for non-interactive shells. |
| .It Fl i \*(Ba Fl o Ic interactive |
| The shell is an interactive shell. |
| This option can only be used when the shell is invoked. |
| See above for details. |
| .It Fl k \*(Ba Fl o Ic keyword |
| Parameter assignments are recognised anywhere in a command. |
| .It Fl l \*(Ba Fl o Ic login |
| The shell is a login shell. |
| This option can only be used when the shell is invoked. |
| See above for what this means. |
| .It Fl m \*(Ba Fl o Ic monitor |
| Enable job control (default for interactive shells). |
| .It Fl n \*(Ba Fl o Ic noexec |
| Do not execute any commands. |
| Useful for checking the syntax of scripts. |
| Ignored if reading commands from a tty. |
| .It Fl p \*(Ba Fl o Ic 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. |
| .Pp |
| If the shell is privileged, setting this flag after startup files |
| have been processed let it go full setuid and/or setgid. |
| Clearing this flag makes the shell drop privileges. |
| Changing this flag resets the groups vector. |
| .It Fl r \*(Ba Fl o Ic restricted |
| The shell is a restricted shell. |
| This option can only be used when the shell is invoked. |
| See above for what this means. |
| .It Fl s \*(Ba Fl o Ic stdin |
| If used when the shell is invoked, commands are read from standard input. |
| Set automatically if the shell is invoked with no arguments. |
| .Pp |
| When |
| .Fl s |
| is used with the |
| .Ic set |
| command it causes the specified arguments to be sorted ASCIIbetically |
| before assigning them to the positional parameters (or to array |
| .Ar name , |
| with |
| .Fl A ) . |
| .It Fl U \*(Ba Fl o Ic utf8\-mode |
| Enable UTF-8 support in the |
| .Sx Emacs editing mode |
| and internal string handling functions. |
| This flag is disabled by default, but can be enabled by setting it on the |
| shell command line; is enabled automatically for interactive shells if |
| requested at compile time, your system supports |
| .Fn setlocale LC_CTYPE \&"" |
| and optionally |
| .Fn nl_langinfo CODESET , |
| or the |
| .Ev LC_ALL , |
| .Ev LC_CTYPE |
| or |
| .Ev LANG |
| environment variables, |
| and at least one of these returns something that matches |
| .Dq UTF\-8 |
| or |
| .Dq utf8 |
| case-insensitively; for direct builtin calls depending on the |
| aforementioned environment variables; or for stdin or scripts, |
| if the input begins with a UTF-8 Byte Order Mark. |
| .Pp |
| In near future, locale tracking will be implemented, which means that |
| .Ic set Fl +U |
| is changed whenever one of the |
| .Tn POSIX |
| locale-related environment variables changes. |
| .It Fl u \*(Ba Fl o Ic nounset |
| Referencing of an unset parameter, other than |
| .Dq Li $@ |
| or |
| .Dq Li $* , |
| is treated as an error, unless one of the |
| .Ql \- , |
| .Ql + |
| or |
| .Ql = |
| modifiers is used. |
| .It Fl v \*(Ba Fl o Ic verbose |
| Write shell input to standard error as it is read. |
| .It Fl X \*(Ba Fl o Ic markdirs |
| Mark directories with a trailing |
| .Ql / |
| during globbing. |
| .It Fl x \*(Ba Fl o Ic xtrace |
| Print commands when they are executed, preceded by |
| .Ev PS4 . |
| .It Fl o Ic bgnice |
| Background jobs are run with lower priority. |
| .It Fl o Ic braceexpand |
| Enable brace expansion. |
| This is enabled by default. |
| .It Fl o Ic emacs |
| Enable BRL emacs-like command-line editing (interactive shells only); see |
| .Sx Emacs editing mode . |
| Enabled by default. |
| .It Fl o Ic gmacs |
| Enable gmacs-like command-line editing (interactive shells only). |
| Currently identical to emacs editing except that |
| .Li transpose\-chars Pq \*(haT |
| acts slightly differently. |
| .It Fl o Ic ignoreeof |
| The shell will not (easily) exit when end-of-file is read; |
| .Ic exit |
| must be used. |
| To avoid infinite loops, the shell will exit if |
| .Dv EOF |
| is read 13 times in a row. |
| .It Fl o Ic inherit\-xtrace |
| Do not reset |
| .Fl o Ic xtrace |
| upon entering functions (default). |
| .It Fl o Ic nohup |
| Do not kill running jobs with a |
| .Dv SIGHUP |
| signal when a login shell exits. |
| Currently set by default, but this may |
| change in the future to be compatible with |
| .At |
| .Nm ksh , |
| which |
| doesn't have this option, but does send the |
| .Dv SIGHUP |
| signal. |
| .It Fl o Ic nolog |
| No effect. |
| In the original Korn shell, this prevented function definitions from |
| being stored in the history file. |
| .It Fl o Ic physical |
| Causes the |
| .Ic cd |
| and |
| .Ic pwd |
| commands to use |
| .Dq physical |
| (i.e. the filesystem's) |
| .Dq Li .. |
| directories instead of |
| .Dq logical |
| directories (i.e. the shell handles |
| .Dq Li .. , |
| 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 |
| .Ev PWD |
| parameter; only the |
| .Ic cd |
| command changes |
| .Ev PWD . |
| See |
| .Ic cd |
| and |
| .Ic pwd |
| above for more details. |
| .It Fl o Ic pipefail |
| Make the exit status of a pipeline the rightmost non-zero errorlevel, |
| or zero if all commands exited with zero. |
| .It Fl o Ic posix |
| Behave closer to the standards |
| (see |
| .Sx POSIX mode |
| for details). |
| Automatically enabled if the shell invocation basename, after |
| .Sq \- |
| and |
| .Sq r |
| processing, begins with |
| .Dq sh |
| and |
| .Pq often used for the Nm lksh No binary |
| this autodetection feature is compiled in. |
| As a side effect, setting this flag turns off the |
| .Ic braceexpand |
| and |
| .Ic utf8\-mode |
| flags, which can be turned back on manually, and |
| .Pq unless both are set in the same command |
| .Ic sh |
| mode. |
| .It Fl o Ic sh |
| Enable kludge |
| .Pa /bin/sh |
| compatibility mode (see |
| .Sx SH mode |
| below for details). |
| Automatically enabled if the basename of the shell invocation, after |
| .Sq \- |
| and |
| .Sq r |
| processing, begins with |
| .Dq sh |
| and this autodetection feature is compiled in |
| .Pq rather uncommon . |
| As a side effect, setting this flag turns off the |
| .Ic braceexpand |
| flag, which can be turned back on manually, and |
| .Ic posix |
| mode (unless both are set in the same command). |
| .It Fl o Ic vi |
| Enable |
| .Xr vi 1 Ns -like |
| command-line editing (interactive shells only). |
| See |
| .Sx Vi editing mode |
| for documentation and limitations. |
| .It Fl o Ic vi\-esccomplete |
| In vi command-line editing, do command and file name completion when Esc |
| .Pq \*(ha[ |
| is entered in command mode. |
| .It Fl o Ic vi\-tabcomplete |
| In vi command-line editing, do command and file name completion when Tab |
| .Pq \*(haI |
| is entered in insert mode (default). |
| .It Fl o Ic viraw |
| No effect. |
| In the original Korn shell, unless |
| .Ic viraw |
| was set, the vi command-line mode would let the |
| .Xr tty 4 |
| driver do the work until Esc was entered. |
| .Nm |
| is always in viraw mode. |
| .El |
| .Pp |
| 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 |
| .Dq Li $\- . |
| .Ic set Fl o |
| with no option name will list all the options and whether each is on or off; |
| .Ic set +o |
| prints a command to restore the current option set, using the internal |
| .Ic set Fl o Ic .reset |
| construct, which is an implementation detail; these commands are transient |
| .Pq only valid within the current shell session . |
| .Pp |
| 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 |
| .Dq Li \-\- |
| and there are no remaining arguments, all positional parameters are cleared. |
| For unknown historical reasons, a lone |
| .Dq Li \- |
| option is treated specially\*(EMit clears both the |
| .Fl v |
| and |
| .Fl x |
| options. |
| If no options or arguments are given, the values of all parameters are printed |
| .Pq suitably quoted . |
| .Pp |
| .It Xo |
| .Ic setenv |
| .Op Ar name Op Ar value |
| .Xc |
| .Pq Li dot.mkshrc No function |
| Without arguments, display the names and values of all exported parameters. |
| Otherwise, set |
| .Ar name Ns 's |
| export attribute, and its value to |
| .Ar value Pq empty string if none given . |
| .Pp |
| .It Ic shift Op Ar number |
| .Pq keeps assignments , special |
| The positional parameters |
| .Ar number Ns +1 , |
| .Ar number Ns +2 , |
| etc. |
| .Pq Ar number No defaults to 1 |
| are renamed to 1, 2, etc. |
| .Pp |
| .It Ic sleep Ar seconds |
| .Pq regular , needs Xr select 2 |
| Suspends execution for a minimum of the |
| .Ar seconds |
| (specified as positive decimal value with an optional fractional part). |
| Signal delivery may continue execution earlier. |
| .Pp |
| .It Ic smores Op Ar |
| .Pq Li dot.mkshrc No function |
| Simple pager: |
| .Aq Enter |
| next; |
| .So q Sc Ns + Ns Aq Enter |
| quit |
| .Pp |
| .It Ic source Ar file Op Ar arg ... |
| .Pq keeps assignments |
| Like |
| .Ic \&. |
| .Pq Dq dot , |
| except that the current working directory is appended to the |
| search path. |
| .Pq GNU Nm bash No extension |
| .Pp |
| .It Ic suspend |
| .Pq needs job control and Xr getsid 2 |
| Stops the shell as if it had received the suspend character from |
| the terminal. |
| .Pp |
| 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 |
| .Xr su 1 , |
| it can be suspended. |
| .Pp |
| .It Ic test Ar expression |
| .It Ic \&[ Ar expression Ic \&] |
| .Pq regular |
| .Ic test |
| evaluates the |
| .Ar 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 |
| .Ic if |
| and |
| .Ic while |
| statements. |
| All |
| .Ar file |
| expressions, except |
| .Fl h |
| and |
| .Fl L , |
| follow symbolic links. |
| .Pp |
| The following basic expressions are available: |
| .Bl -tag -width 17n |
| .It Fl a Ar file |
| .Ar file |
| exists. |
| .It Fl b Ar file |
| .Ar file |
| is a block special device. |
| .It Fl c Ar file |
| .Ar file |
| is a character special device. |
| .It Fl d Ar file |
| .Ar file |
| is a directory. |
| .It Fl e Ar file |
| .Ar file |
| exists. |
| .It Fl f Ar file |
| .Ar file |
| is a regular file. |
| .It Fl G Ar file |
| .Ar file Ns 's |
| group is the shell's effective group ID. |
| .It Fl g Ar file |
| .Ar file Ns 's |
| mode has the setgid bit set. |
| .It Fl H Ar file |
| .Ar file |
| is a context dependent directory (only useful on HP-UX). |
| .It Fl h Ar file |
| .Ar file |
| is a symbolic link. |
| .It Fl k Ar file |
| .Ar file Ns 's |
| mode has the |
| .Xr sticky 7 |
| bit set. |
| .It Fl L Ar file |
| .Ar file |
| is a symbolic link. |
| .It Fl O Ar file |
| .Ar file Ns 's |
| owner is the shell's effective user ID. |
| .It Fl p Ar file |
| .Ar file |
| is a named pipe |
| .Pq Tn FIFO . |
| .It Fl r Ar file |
| .Ar file |
| exists and is readable. |
| .It Fl S Ar file |
| .Ar file |
| is a |
| .Xr unix 4 Ns -domain |
| socket. |
| .It Fl s Ar file |
| .Ar file |
| is not empty. |
| .It Fl t Ar fd |
| File descriptor |
| .Ar fd |
| is a |
| .Xr tty 4 |
| device. |
| .It Fl u Ar file |
| .Ar file Ns 's |
| mode has the setuid bit set. |
| .It Fl w Ar file |
| .Ar file |
| exists and is writable. |
| .It Fl x Ar file |
| .Ar file |
| exists and is executable. |
| .It Ar file1 Fl nt Ar file2 |
| .Ar file1 |
| is newer than |
| .Ar file2 |
| or |
| .Ar file1 |
| exists and |
| .Ar file2 |
| does not. |
| .It Ar file1 Fl ot Ar file2 |
| .Ar file1 |
| is older than |
| .Ar file2 |
| or |
| .Ar file2 |
| exists and |
| .Ar file1 |
| does not. |
| .It Ar file1 Fl ef Ar file2 |
| .Ar file1 |
| is the same file as |
| .Ar file2 . |
| .It Ar string |
| .Ar string |
| has non-zero length. |
| .It Fl n Ar string |
| .Ar string |
| is not empty. |
| .It Fl z Ar string |
| .Ar string |
| is empty. |
| .It Fl v Ar name |
| The shell parameter |
| .Ar name |
| is set. |
| .It Fl o Ar option |
| Shell |
| .Ar option |
| is set (see the |
| .Ic set |
| command above for a list of options). |
| As a non-standard extension, if the option starts with a |
| .Ql \&! , |
| the test is negated; the test always fails if |
| .Ar option |
| doesn't exist (so [ \-o foo \-o \-o !foo ] returns true if and only if option |
| .Ar foo |
| exists). |
| The same can be achieved with [ \-o ?foo ] like in |
| .At |
| .Nm ksh93 . |
| .Ar option |
| can also be the short flag prefixed with either |
| .Ql \- |
| or |
| .Ql + |
| .Pq no logical negation , |
| for example |
| .Dq Li \-x |
| or |
| .Dq Li +x |
| instead of |
| .Dq Li xtrace . |
| .It Ar string No = Ar string |
| Strings are equal. |
| In double brackets, pattern matching |
| .Pq R59+ using extglobs |
| occurs if the right-hand string isn't quoted. |
| .It Ar string No == Ar string |
| Same as |
| .Sq = |
| .Pq deprecated . |
| .It Ar string No != Ar string |
| Strings are not equal. |
| See |
| .Sq = |
| regarding pattern matching. |
| .It Ar string No \*(Gt Ar string |
| First string operand is greater than second string operand. |
| .It Ar string No \*(Lt Ar string |
| First string operand is less than second string operand. |
| .It Ar number Fl eq Ar number |
| Numbers compare equal. |
| .It Ar number Fl ne Ar number |
| Numbers compare not equal. |
| .It Ar number Fl ge Ar number |
| Numbers compare greater than or equal. |
| .It Ar number Fl gt Ar number |
| Numbers compare greater than. |
| .It Ar number Fl le Ar number |
| Numbers compare less than or equal. |
| .It Ar number Fl \< Ar number |
| Numbers compare less than. |
| .El |
| .Pp |
| The above basic expressions, in which unary operators have precedence over |
| binary operators, may be combined with the following operators (listed in |
| increasing order of precedence): |
| .Bd -literal -offset indent |
| expr \-o expr Logical OR. |
| expr \-a expr Logical AND. |
| ! expr Logical NOT. |
| ( expr ) Grouping. |
| .Ed |
| .Pp |
| Note that a number actually may be an arithmetic expression, such as |
| a mathematical term or the name of an integer variable: |
| .Bd -literal -offset indent |
| x=1; [ "x" \-eq 1 ] evaluates to true |
| .Ed |
| .Pp |
| Note that some special rules are applied (courtesy of |
| .Px |
| ) if the number of arguments to |
| .Ic test |
| or inside the brackets |
| .Ic \&[ ... \&] |
| is less than five: if leading |
| .Dq Li \&! |
| arguments can be stripped such that only one to three arguments remain, |
| then the lowered comparison is executed; (thanks to XSI) parentheses |
| .Ic \e( ... \e) |
| lower four- and three-argument forms to two- and one-argument forms, |
| respectively; three-argument forms ultimately prefer binary operations, |
| followed by negation and parenthesis lowering; two- and four-argument forms |
| prefer negation followed by parenthesis; the one-argument form always implies |
| .Fl n . |
| To assume this is not necessarily portable. |
| .Pp |
| .Sy Note : |
| A common mistake is to use |
| .Dq Li if \&[ $foo = bar \&] |
| which fails if parameter |
| .Dq foo |
| is empty or unset, if it has embedded spaces (i.e.\& |
| .Ev IFS |
| octets) or if it is a unary operator like |
| .Dq Li \&! |
| or |
| .Dq Li \-n . |
| Use tests like |
| .Dq Li if \&[ x\&"$foo\&" = x"bar" \&] |
| instead, or the double-bracket operator (see |
| .Ic \&[[ |
| above): |
| .Dq Li if \&[[ $foo = bar \&]] |
| or, to avoid pattern matching, |
| .Dq Li if \&[[ $foo = \&"$bar" \&]] ; |
| the |
| .Ic \&[[ ... \&]] |
| construct is not only more secure to use but also often faster. |
| .Pp |
| .It Xo |
| .Ic time |
| .Op Fl p |
| .Op Ar pipeline |
| .Xc |
| .Pq reserved word |
| If a |
| .Ar pipeline |
| is given, the times used to execute 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. |
| .Pp |
| 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). |
| .Pp |
| Times are reported to standard error; the format of the output is: |
| .Pp |
| .Dl "0m0.03s real 0m0.02s user 0m0.01s system" |
| .Pp |
| If the |
| .Fl p |
| option is given (which is only permitted if |
| .Ar pipeline |
| is a simple command), the output is slightly longer: |
| .Bd -literal -offset indent |
| real 0.03 |
| user 0.02 |
| sys 0.01 |
| .Ed |
| .Pp |
| Simple redirections of standard error do not affect |
| .Ic time Ns 's output : |
| .Pp |
| .Dl $ time sleep 1 2\*(Gtafile |
| .Dl $ { time sleep 1; } 2\*(Gtafile |
| .Pp |
| Times for the first command do not go to |
| .Dq afile , |
| but those of the second command do. |
| .Pp |
| .It Ic times |
| .Pq keeps assignments , special |
| Print the accumulated user and system times (see above) used both |
| by the shell and by processes that the shell started which have exited. |
| The format of the output is: |
| .Bd -literal -offset indent |
| 0m0.01s 0m0.00s |
| 0m0.04s 0m0.02s |
| .Ed |
| .Pp |
| .It Ic trap Ar n Op Ar signal ... |
| .Pq keeps assignments , special |
| If the first operand is a decimal unsigned integer, this resets all |
| specified signals to the default action, i.e. is the same as calling |
| .Ic trap |
| with a dash |
| .Pq Dq Li \- |
| as |
| .Ar handler , |
| followed by the arguments (interpreted as signals). |
| .Pp |
| .It Ic trap Op Ar handler signal ... |
| .Pq keeps assignments , special |
| Sets a trap handler that is to be executed when any of the specified |
| .Ar signal Ns s |
| are received. |
| .Ar handler |
| is either an empty string, indicating the signals are to be ignored, a dash |
| .Pq Dq Li \- , |
| indicating that the default action is to be taken for the signals |
| .Pq see Xr signal 3 , |
| or a string comprised of shell commands to be executed at the first opportunity |
| (i.e. when the current command completes or before printing the next |
| .Ev PS1 |
| prompt) after receipt of one of the signals. |
| .Ar signal |
| is the name, possibly prefixed with |
| .Dq Li SIG , |
| of a signal |
| .Po |
| e.g.\& |
| .Dv PIPE , |
| .Dv ALRM |
| or |
| .Dv SIGINT |
| .Pc |
| or the number of the signal (see the |
| .Ic kill Fl l |
| command above). |
| .Pp |
| There are two special signals: |
| .Dv EXIT |
| .Pq also known as 0 , |
| which is executed when the shell is about to exit, and |
| .Dv ERR , |
| which is executed after an error occurs; an error is something |
| that would cause the shell to exit if the |
| .Ic set Fl e |
| or |
| .Ic set Fl o Ic errexit |
| option were set. |
| .Dv EXIT |
| handlers are executed in the environment of the last executed command. |
| The original Korn shell's |
| .Dv DEBUG |
| trap and handling of |
| .Dv ERR |
| and |
| .Dv EXIT |
| in functions are not yet implemented. |
| .Pp |
| Note that, for non-interactive shells, the trap handler cannot be changed |
| for signals that were ignored when the shell started. |
| .Pp |
| With no arguments, the current state of the traps that have been set since |
| the shell started is shown as a series of |
| .Ic trap |
| commands. |
| Note that the output of |
| .Ic trap |
| cannot be usefully captured or piped to another process (an artifact |
| of the fact that traps are cleared when subprocesses are created). |
| .Pp |
| .It Ic true |
| .Pq regular |
| A command that exits with a zero status. |
| .Pp |
| .It Ic type Ar name ... |
| .Pq built-in alias |
| Reveal how |
| .Ar name |
| would be interpreted as command. |
| .Pp |
| .It Xo |
| .Ic typeset |
| .Op Fl +aglpnrtUux |
| .Oo Fl L Ns Op Ar n |
| .No \*(Ba Fl R Ns Op Ar n |
| .No \*(Ba Fl Z Ns Op Ar n Oc |
| .Op Fl i Ns Op Ar n |
| .Oo Ar name |
| .Op Ns = Ns Ar value |
| .Ar ... Oc |
| .Xc |
| .It Xo |
| .Ic typeset |
| .Fl f Op Fl tux |
| .Op Ar name ... |
| .Xc |
| .Pq keeps assignments , decl-util |
| Display or set attributes of shell parameters or functions. |
| With no |
| .Ar name |
| arguments, parameter attributes are shown; |
| if no options are used, the current attributes of all parameters are printed as |
| .Ic typeset |
| commands; if an option is given (or |
| .Dq Li \- |
| with no option letter), all parameters and their values with the specified |
| attributes are printed; if options are introduced with |
| .Ql + |
| .Po |
| or |
| .Dq Li + |
| alone |
| .Pc , |
| only names are printed. |
| .Pp |
| If any |
| .Ar name |
| arguments are given, the attributes of the so named parameters are set |
| .Pq Ic \&\- |
| or cleared |
| .Pq Ic \&+ ; |
| inside a function, this will cause the parameters to be created (and set to |
| .Dq |
| if no value is given) in the local scope |
| .Pq except if Fl g No is used . |
| Values for parameters may optionally be specified. |
| For |
| .Ar name Ns \&[*] , |
| the change affects all elements of the array, and no value may be specified. |
| .Pp |
| When |
| .Fl f |
| is used, |
| .Ic typeset |
| operates on the attributes of functions. |
| As with parameters, if no |
| .Ar name |
| arguments are given, |
| functions are listed with their values (i.e. definitions) unless |
| options are introduced with |
| .Ql + , |
| in which case only the names are displayed. |
| .Bl -tag -width Ds |
| .It Fl a |
| Indexed array attribute. |
| .It Fl f |
| Function mode. |
| Display or set shell functions and their attributes, |
| instead of shell parameters. |
| .It Fl g |
| .Dq global |
| mode. |
| Do not cause named parameters to be created in |
| the local scope when called inside a function. |
| .It Fl i Ns Op Ar n |
| Integer attribute. |
| .Ar 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. |
| .It Fl L Ns Op Ar n |
| Left justify attribute. |
| .Ar n |
| specifies the field width. |
| If |
| .Ar n |
| is not specified, the current width of the parameter |
| (or the width of its first assigned value) is used. |
| Leading whitespace (and digit zeros, if used with the |
| .Fl Z |
| option) is stripped. |
| If necessary, values are either truncated |
| or padded with space to fit the field width. |
| .It Fl l |
| Lower case attribute. |
| All upper case ASCII characters in values are converted to lower case. |
| (In the original Korn shell, this parameter meant |
| .Dq long integer |
| when used with the |
| .Fl i |
| option.) |
| .It Fl n |
| Create a bound variable (name reference): any access to the variable |
| .Ar name |
| will access the variable |
| .Ar value |
| in the current scope (this is different from |
| .At |
| .Nm ksh93 ! ) |
| instead. |
| Also different from |
| .At |
| .Nm ksh93 |
| is that |
| .Ar value |
| is lazily evaluated at the time |
| .Ar name |
| is accessed. |
| This can be used by functions to access variables whose names are |
| passed as parameters, instead of resorting to |
| .Ic eval . |
| .It Fl p |
| Print complete |
| .Ic typeset |
| commands that can be used to re-create the attributes and values of |
| parameters. |
| .It Fl R Ns Op Ar n |
| Right justify attribute. |
| .Ar n |
| specifies the field width. |
| If |
| .Ar n |
| is not specified, the current width of the parameter |
| (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. |
| .It Fl 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. |
| .It Fl t |
| Tag attribute. |
| This attribute has no meaning to the shell for parameters |
| and is provided for application use. |
| .Pp |
| For functions, |
| .Fl t |
| is the trace attribute. |
| When functions with the trace attribute are executed, the |
| .Fl o Ic xtrace |
| .Pq Fl x |
| shell option is temporarily turned on. |
| .It Fl U |
| Unsigned integer attribute. |
| Integers are printed as unsigned values (combined with the |
| .Fl i |
| option). |
| .It Fl u |
| Upper case attribute. |
| All lower case ASCII characters in values are converted to upper case. |
| (In the original Korn shell, this parameter meant |
| .Dq unsigned integer |
| when used with the |
| .Fl i |
| option which meant upper case letters would never be used for bases greater |
| than 10. |
| See |
| .Fl U |
| above.) |
| .Pp |
| For functions, |
| .Fl u |
| is the undefined attribute, used with |
| .Ev FPATH . |
| See |
| .Sx Functions |
| above for the implications of this. |
| .It Fl x |
| Export attribute. |
| Parameters are placed in the environment of any executed commands. |
| Functions cannot be exported for security reasons |
| .Pq Dq shellshock . |
| .It Fl Z Ns Op Ar n |
| Zero fill attribute. |
| If not combined with |
| .Fl L , |
| this is the same as |
| .Fl R , |
| except zero padding is used instead of space padding. |
| For integers, the number is padded, not the base. |
| .El |
| .Pp |
| If any of the |
| .\" long integer , |
| .Fl i , |
| .Fl L , |
| .Fl l , |
| .Fl R , |
| .Fl U , |
| .Fl u |
| or |
| .Fl Z |
| options are changed, all others from this set are cleared, |
| unless they are also given on the same command line. |
| .Pp |
| .It Xo |
| .Ic ulimit |
| .Op Fl aBCcdefHilMmnOPpqrSsTtVvwx |
| .Op Ar value |
| .Xc |
| .Pq regular |
| Display or set process limits. |
| If no options are used, the file size limit |
| .Pq Fl f |
| is assumed. |
| .Ar value , |
| if specified, may be either an arithmetic expression or the word |
| .Dq Li 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\*(EMsome systems have only the |
| .Fl f |
| limit, or not even that, or can set only the soft limits, etc. |
| .Bl -tag -width 5n |
| .It Fl a |
| Display all limits (soft limits unless |
| .Fl H |
| is used). |
| .It Fl B Ar n |
| Set the socket buffer size to |
| .Ar n |
| kibibytes. |
| .It Fl C Ar n |
| Set the number of cached threads to |
| .Ar n . |
| .It Fl c Ar n |
| Impose a size limit of |
| .Ar n |
| blocks on the size of core dumps. |
| Silently ignored if the system does not support this limit. |
| .It Fl d Ar n |
| Limit the size of the data area to |
| .Ar n |
| kibibytes. |
| .br |
| On some systems, read-only maximum |
| .Xr brk 2 |
| size minus |
| .Li etext . |
| .It Fl e Ar n |
| Set the maximum niceness to |
| .Ar n . |
| .It Fl f Ar n |
| Impose a size limit of |
| .Ar n |
| blocks on files written by the shell and its child processes |
| .Pq any size may be read . |
| .It Fl H |
| Set the hard limit only (the default is to set both hard and soft limits). |
| With |
| .Fl a , |
| display all hard limits. |
| .It Fl i Ar n |
| Set the number of pending signals to |
| .Ar n . |
| .It Fl l Ar n |
| Impose a limit of |
| .Ar n |
| kibibytes on the amount of locked (wired) physical memory. |
| .It Fl M Ar n |
| Set the AIO locked memory to |
| .Ar n |
| kibibytes. |
| .It Fl m Ar n |
| Impose a limit of |
| .Ar n |
| kibibytes on the amount of physical memory used. |
| .It Fl n Ar n |
| Impose a limit of |
| .Ar n |
| file descriptors that can be open at once. |
| On some systems attempts to set are silently ignored. |
| .It Fl O Ar n |
| Set the number of AIO operations to |
| .Ar n . |
| .It Fl P Ar n |
| Limit the number of threads per process to |
| .Ar n . |
| .Pp |
| This option mostly matches |
| .At |
| .Nm ksh93 Ns 's |
| .Fl T ; |
| .br |
| on |
| .Tn AIX , |
| see |
| .Fl r |
| as used by its |
| .Nm ksh |
| though. |
| .It Fl p Ar n |
| Impose a limit of |
| .Ar n |
| processes that can be run by the user (uid) at any one time. |
| .It Fl q Ar n |
| Limit the size of |
| .Tn POSIX |
| message queues to |
| .Ar n |
| bytes. |
| .It Fl r Ar n |
| .Pq Cm AIX |
| Limit the number of threads per process to |
| .Ar n . |
| .br |
| .Pq Cm Linux |
| Set the maximum real-time priority to |
| .Ar n . |
| .It Fl S |
| Set the soft limit only (the default is to set both hard and soft limits). |
| With |
| .Fl a , |
| display soft limits (default). |
| .It Fl s Ar n |
| Limit the size of the stack area to |
| .Ar n |
| kibibytes. |
| .It Fl T Ar n |
| Impose a time limit of |
| .Ar n |
| real seconds |
| .Pq Dq humantime |
| to be used by each process. |
| .It Fl t Ar n |
| Impose a time limit of |
| .Ar n |
| CPU seconds spent in user mode to be used by each process. |
| .It Fl V Ar n |
| Set the number of vnode monitors on Haiku to |
| .Ar n . |
| .It Fl v Ar n |
| Impose a limit of |
| .Ar n |
| kibibytes on the amount of virtual memory (address space) used. |
| .It Fl w Ar n |
| Limit the amount of swap space used to at most |
| .Ar n |
| kibibytes. |
| .It Fl x Ar n |
| Set the maximum number of file locks to |
| .Ar n . |
| .El |
| .Pp |
| As far as |
| .Ic ulimit |
| is concerned, a block is 512 bytes. |
| .Pp |
| .It Xo |
| .Ic umask |
| .Op Fl S |
| .Op Ar mask |
| .Xc |
| .Pq regular |
| Display or set the file permission creation mask or umask (see |
| .Xr umask 2 ) . |
| If the |
| .Fl S |
| option is used, the mask displayed or set is symbolic; otherwise, it is an |
| octal number. |
| .Pp |
| Symbolic masks are like those used by |
| .Xr 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, |
| .Dq Li ug=rwx,o= |
| sets the mask so files will not be readable, writable or executable by |
| .Dq others , |
| and is equivalent (on most systems) to the octal mask |
| .Dq Li 007 . |
| .Pp |
| .It Xo |
| .Ic unalias |
| .Op Fl adt |
| .Op Ar name ... |
| .Xc |
| .Pq regular |
| The aliases for the given names are removed. |
| If the |
| .Fl a |
| option is used, all aliases are removed. |
| If the |
| .Fl t |
| or |
| .Fl d |
| options are used, the indicated operations are carried out on tracked or |
| directory aliases, respectively. |
| .Pp |
| .It Xo |
| .Ic unset |
| .Op Fl fv |
| .Ar parameter ... |
| .Xc |
| .Pq keeps assignments , special |
| Unset the named parameters |
| .Pq Fl v , No the default |
| or functions |
| .Pq Fl f . |
| With |
| .Ar parameter Ns \&[*] , |
| 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). |
| .Pp |
| .It Ic wait Op Ar job ... |
| .Pq regular |
| Wait for the specified job(s) to finish. |
| The exit status of |
| .Ic 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 |
| .Ic kill Fl l Ar 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 |
| .Sx Job control |
| below for the format of |
| .Ar job . |
| .Ic wait |
| will return if a signal for which a trap has been set is received or if a |
| .Dv SIGHUP , |
| .Dv SIGINT |
| or |
| .Dv SIGQUIT |
| signal is received. |
| .Pp |
| If no jobs are specified, |
| .Ic 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). |
| .Pp |
| .It Xo |
| .Ic whence |
| .Op Fl pv |
| .Op Ar name ... |
| .Xc |
| .Pq regular |
| Without the |
| .Fl v |
| option, it is the same as |
| .Ic command Fl v , |
| except aliases are printed as their definition only. |
| With the |
| .Fl v |
| option, it is exactly identical to |
| .Ic command Fl V . |
| In either case, with the |
| .Fl p |
| option the search is restricted to the (current) |
| .Ev PATH . |
| .Pp |
| .It Xo Ic which |
| .Op Fl a |
| .Op Ar name ... |
| .Xc |
| .Pq Li dot.mkshrc No function |
| Without |
| .Fl a , |
| behaves like |
| .Ic whence Fl p |
| (does a |
| .Ev PATH |
| search for each |
| .Ar name |
| printing the resulting pathname if found); with |
| .Fl a , |
| matches in all |
| .Ev PATH |
| components are printed, i.e. the search is not stopped after a match. |
| If no |
| .Ar 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. |
| .El |
| .Ss 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 information can be displayed |
| using the |
| .Ic jobs |
| commands. |
| If job control is fully enabled (using |
| .Ic set Fl m |
| or |
| .Ic set Fl o Ic 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 \*(haZ); jobs can be restarted in either the |
| foreground or background using the commands |
| .Ic fg |
| and |
| .Ic bg . |
| .Pp |
| Note that only commands that create processes (e.g. asynchronous commands, |
| subshell commands and non-built-in, non-function commands) can be stopped; |
| commands like |
| .Ic read |
| cannot be. |
| .Pp |
| When a job is created, it is assigned a job number. |
| For interactive shells, this number is printed inside |
| .Dq Li \&[...] , |
| 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 |
| .Ic bg , |
| .Ic fg , |
| .Ic jobs , |
| .Ic kill |
| and |
| .Ic wait |
| commands either by the process ID of the last process in the command pipeline |
| (as stored in the |
| .Ic \&$! |
| parameter) or by prefixing the job number with a percent sign |
| .Pq Ql % . |
| Other percent sequences can also be used to refer to jobs: |
| .Bl -tag -width "%+ x %% x %XX" |
| .It %+ \*(Ba %% \*(Ba % |
| The most recently stopped job or, if there are no stopped jobs, the oldest |
| running job. |
| .It %\- |
| The job that would be the |
| .Ic %+ |
| job if the latter did not exist. |
| .It % Ns Ar n |
| The job with job number |
| .Ar n . |
| .It %? Ns Ar string |
| The job with its command containing the string |
| .Ar string |
| (an error occurs if multiple jobs are matched). |
| .It % Ns Ar string |
| The job with its command starting with the string |
| .Ar string |
| (an error occurs if multiple jobs are matched). |
| .El |
| .Pp |
| When a job changes state (e.g. a background job finishes or foreground job is |
| stopped), the shell prints the following status information: |
| .Pp |
| .D1 [ Ns Ar number ] Ar flag status command |
| .Pp |
| where... |
| .Bl -tag -width "command" |
| .It Ar number |
| is the job number of the job; |
| .It Ar flag |
| is the |
| .Ql + |
| or |
| .Ql \- |
| character if the job is the |
| .Ic %+ |
| or |
| .Ic %\- |
| job, respectively, or space if it is neither; |
| .It Ar status |
| indicates the current state of the job and can be: |
| .Bl -tag -width "RunningXX" |
| .It Done Op Ar number |
| The job exited. |
| .Ar number |
| is the exit status of the job which is omitted if the status is zero. |
| .It Running |
| The job has neither stopped nor exited (note that running does not |
| necessarily mean consuming CPU time\*(EMthe process could be blocked |
| waiting for some event). |
| .It Stopped Op Ar signal |
| The job was stopped by the indicated |
| .Ar signal |
| (if no signal is given, the job was stopped by |
| .Dv SIGTSTP ) . |
| .It Ar signal-description Op Dq core dumped |
| The job was killed by a signal (e.g. memory fault, hangup); use |
| .Ic kill Fl l |
| for a list of signal descriptions. |
| The |
| .Dq Li core dumped |
| message indicates the process created a core file. |
| .El |
| .It Ar command |
| is the command that created the process. |
| If there are multiple processes in |
| the job, each process will have a line showing its |
| .Ar command |
| and possibly its |
| .Ar status , |
| if it is different from the status of the previous process. |
| .El |
| .Pp |
| 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 |
| .Dv SIGHUP |
| signal and the shell exits. |
| Similarly, if the |
| .Ic 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 |
| .Dv SIGHUP |
| signal and the shell exits. |
| .Ss Terminal state |
| The state of the controlling terminal can be modified by a command |
| executed 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. |
| .Ss POSIX mode |
| Entering |
| .Ic set Fl o Ic posix |
| mode will cause |
| .Nm |
| to behave even more |
| .Tn POSIX |
| compliant in places where the defaults or opinions differ. |
| Note that |
| .Nm mksh |
| will still operate with unsigned 32-bit arithmetic; use |
| .Nm lksh |
| if arithmetic on the host |
| .Vt long |
| data type, complete with ISO C Undefined Behaviour, is required; |
| refer to the |
| .Xr lksh 1 |
| manual page for details. |
| Most other historic, |
| .At |
| .Nm ksh Ns -compatible |
| or opinionated differences can be disabled by using this mode; these are: |
| .Bl -bullet |
| .It |
| The incompatible GNU |
| .Nm bash |
| I/O redirection |
| .Ic &\*(Gt Ns Ar file |
| is not supported. |
| .It |
| File descriptors created by I/O redirections are inherited by |
| child processes. |
| .It |
| Numbers with a leading digit zero are interpreted as octal. |
| .It |
| The |
| .Nm echo |
| builtin does not interpret backslashes and only supports the exact option |
| .Fl n . |
| .It |
| Alias expansion with a trailing space only reruns on command words. |
| .It |
| Tilde expansion follows POSIX instead of Korn shell rules. |
| .It |
| The exit status of |
| .Ic fg |
| is always 0. |
| .It |
| .Ic kill |
| .Fl l |
| only lists signal names, all in one line. |
| .It |
| .Ic getopts |
| does not accept options with a leading |
| .Ql + . |
| .It |
| .Ic exec |
| skips builtins, functions and other commands and uses a |
| .Ev PATH |
| search to determine the utility to execute. |
| .El |
| .Ss SH mode |
| Compatibility mode; intended for use with legacy scripts that |
| cannot easily be fixed; the changes are as follows: |
| .Bl -bullet |
| .It |
| The incompatible GNU |
| .Nm bash |
| I/O redirection |
| .Ic &\*(Gt Ns Ar file |
| is not supported. |
| .It |
| File descriptors created by I/O redirections are inherited by |
| child processes. |
| .It |
| The |
| .Nm echo |
| builtin does not interpret backslashes and only supports the exact option |
| .Fl n , |
| unless built with |
| .Ev \-DMKSH_MIDNIGHTBSD01ASH_COMPAT . |
| .It |
| The substitution operations |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf # Ar pat No } , |
| .Sm on |
| .Xc |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf ## Ar pat No } , |
| .Sm on |
| .Xc |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf % Ar pat No } , |
| .Sm on |
| .Xc |
| and |
| .Sm off |
| .Xo |
| .Pf ${ Ar x |
| .Pf %% Ar pat No } |
| .Sm on |
| .Xc |
| wrongly do not require a parenthesis to be escaped and do not parse extglobs. |
| .It |
| The getopt construct from |
| .Xr lksh 1 |
| passes through the errorlevel. |
| .It |
| .Nm sh |
| .Fl c |
| eats a leading |
| .Fl \- |
| if built with |
| .Ev \-DMKSH_MIDNIGHTBSD01ASH_COMPAT . |
| .El |
| .Ss Interactive input line editing |
| The shell supports three modes of reading command lines from a |
| .Xr tty 4 |
| in an interactive session, controlled by the |
| .Ic emacs , |
| .Ic gmacs |
| and |
| .Ic vi |
| options (at most one of these can be set at once). |
| The default is |
| .Ic emacs . |
| Editing modes can be set explicitly using the |
| .Ic set |
| built-in. |
| If none of these options are enabled, |
| the shell simply reads lines using the normal |
| .Xr tty 4 |
| driver. |
| If the |
| .Ic emacs |
| or |
| .Ic gmacs |
| option is set, the shell allows emacs-like editing of the command; similarly, |
| if the |
| .Ic vi |
| option is set, the shell allows vi-like editing of the command. |
| These modes are described in detail in the following sections. |
| .Pp |
| In these editing modes, if a line is longer than the screen width (see the |
| .Ev COLUMNS |
| parameter), |
| a |
| .Ql \*(Gt , |
| .Ql + |
| or |
| .Ql \*(Lt |
| 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. |
| .Pp |
| 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. |
| .Ss Emacs editing mode |
| When the |
| .Ic emacs |
| option is set, interactive input line editing is enabled. |
| Warning: This mode is |
| slightly different from the emacs mode in the original Korn shell. |
| In this mode, various editing commands |
| (typically 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 |
| .Ic bind |
| command. |
| .Pp |
| The following is a list of available editing commands. |
| Each description starts with the name of the command, |
| suffixed with a colon; |
| an |
| .Op Ar 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 \*(ha[. |
| These control sequences are not case sensitive. |
| A count prefix for a command is entered using the sequence |
| .Pf \*(ha[ Ns Ar n , |
| where |
| .Ar n |
| is a sequence of 1 or more digits. |
| Unless otherwise specified, if a count is |
| omitted, it defaults to 1. |
| .Pp |
| Note that editing command names are used only with the |
| .Ic bind |
| command. |
| Furthermore, many editing commands are useful only on terminals with |
| a visible cursor. |
| The user's |
| .Xr tty 4 |
| characters (e.g.\& |
| .Dv ERASE ) |
| are bound to |
| reasonable substitutes and override the default bindings; |
| their customary values are shown in parentheses below. |
| The default bindings were chosen to resemble corresponding |
| Emacs key bindings: |
| .Bl -tag -width Ds |
| .It Xo abort: |
| .No INTR Pq \*(haC , |
| .No \*(haG |
| .Xc |
| Abort the current command, save it to the history, empty the line buffer and |
| set the exit state to interrupted. |
| .It auto\-insert: Op Ar n |
| Simply causes the character to appear as literal input. |
| Most ordinary characters are bound to this. |
| .It Xo backward\-char: |
| .Op Ar n |
| .No \*(haB , \*(haXD , ANSI-CurLeft , PC-CurLeft |
| .Xc |
| Moves the cursor backward |
| .Ar n |
| characters. |
| .It Xo backward\-word: |
| .Op Ar n |
| .No \*(ha[b , ANSI-Ctrl-CurLeft , ANSI-Alt-CurLeft |
| .Xc |
| Moves the cursor backward to the beginning of the word; words consist of |
| alphanumerics, underscore |
| .Pq Ql _ |
| and dollar sign |
| .Pq Ql $ |
| characters. |
| .It beginning\-of\-history: \*(ha[\*(Lt |
| Moves to the beginning of the history. |
| .It beginning\-of\-line: \*(haA, ANSI-Home, PC-Home |
| Moves the cursor to the beginning of the edited input line. |
| .It Xo capitalise\-word: |
| .Op Ar n |
| .No \*(ha[C , \*(ha[c |
| .Xc |
| Uppercase the first ASCII character in the next |
| .Ar n |
| words, leaving the cursor past the end of the last word. |
| .It clear\-screen: \*(ha[\*(haL |
| 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. |
| .It comment: \*(ha[# |
| If the current line does not begin with a comment character, one is added at |
| the beginning of the line and the line is entered (as if return had been |
| pressed); otherwise, the existing comment characters are removed and the cursor |
| is placed at the beginning of the line. |
| .It complete: \*(ha[\*(ha[ |
| Automatically completes as much as is unique of the command name or the file |
| name containing the cursor. |
| If the entire remaining command or file name is |
| unique, a space is printed after its completion, unless it is a directory name |
| in which case |
| .Ql / |
| 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). |
| .It complete\-command: \*(haX\*(ha[ |
| 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 |
| .Ic complete |
| command above. |
| .It complete\-file: \*(ha[\*(haX |
| 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 |
| .Ic complete |
| command described above. |
| .It complete\-list: \*(haI, \*(ha[= |
| 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 |
| .Ic complete |
| command above. |
| Note that \*(haI is usually generated by the Tab (tabulator) key. |
| .It Xo delete\-char\-backward: |
| .Op Ar n |
| .No ERASE Pq \*(haH , |
| .No \*(ha? , \*(haH |
| .Xc |
| Deletes |
| .Ar n |
| characters before the cursor. |
| .It Xo delete\-char\-forward: |
| .Op Ar n |
| .No ANSI-Del , PC-Del |
| .Xc |
| Deletes |
| .Ar n |
| characters after the cursor. |
| .It Xo delete\-word\-backward: |
| .Op Ar n |
| .No Pfx1+ERASE Pq \*(ha[\*(haH , |
| .No WERASE Pq \*(haW , |
| .No \*(ha[\*(ha? , \*(ha[\*(haH , \*(ha[h |
| .Xc |
| Deletes |
| .Ar n |
| words before the cursor. |
| .It Xo delete\-word\-forward: |
| .Op Ar n |
| .No \*(ha[d |
| .Xc |
| Deletes characters after the cursor up to the end of |
| .Ar n |
| words. |
| .It Xo down\-history: |
| .Op Ar n |
| .No \*(haN , \*(haXB , ANSI-CurDown , PC-CurDown |
| .Xc |
| Scrolls the history buffer forward |
| .Ar n |
| lines (later). |
| Each input line originally starts just after the last entry |
| in the history buffer, so |
| .Ic down\-history |
| is not useful until either |
| .Ic search\-history , |
| .Ic search\-history\-up |
| or |
| .Ic up\-history |
| has been performed. |
| .It Xo downcase\-word: |
| .Op Ar n |
| .No \*(ha[L , \*(ha[l |
| .Xc |
| Lowercases the next |
| .Ar n |
| words. |
| .It Xo edit\-line: |
| .Op Ar n |
| .No \*(haXe |
| .Xc |
| Internally run the command |
| .Ic fc \-e \&"${VISUAL:\-${EDITOR:\-vi}}" Fl \- Ar n |
| .br |
| on a temporary script file to interactively edit line |
| .Ar n |
| (if |
| .Ar 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 |
| .Pq resulting |
| and original lines are added onto history. |
| .It end\-of\-history: \*(ha[\*(Gt |
| Moves to the end of the history. |
| .It end\-of\-line: \*(haE, ANSI-End, PC-End |
| Moves the cursor to the end of the input line. |
| .It eot: \*(ha_ |
| Acts as an end-of-file; this is useful because edit-mode input disables |
| normal terminal input canonicalisation. |
| .It Xo eot\-or\-delete: |
| .Op Ar n |
| .No EOF Pq \*(haD |
| .Xc |
| If alone on a line, same as |
| .Ic eot , |
| otherwise, |
| .Ic delete\-char\-forward . |
| .It error: (not bound) |
| Error (ring the bell). |
| .It evaluate\-region: \*(ha[\*(haE |
| Evaluates the text between the mark and the cursor position |
| .Pq 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. |
| .It exchange\-point\-and\-mark: \*(haX\*(haX |
| Places the cursor where the mark is and sets the mark to where the cursor was. |
| .It expand\-file: \*(ha[* |
| Appends a |
| .Ql * |
| 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. |
| .It Xo forward\-char: |
| .Op Ar n |
| .No \*(haF , \*(haXC , ANSI-CurRight , PC-CurRight |
| .Xc |
| Moves the cursor forward |
| .Ar n |
| characters. |
| .It Xo forward\-word: |
| .Op Ar n |
| .No \*(ha[f , ANSI-Ctrl-CurRight , ANSI-Alt-CurRight |
| .Xc |
| Moves the cursor forward to the end of the |
| .Ar n Ns th |
| word. |
| .It Xo goto\-history: |
| .Op Ar n |
| .No \*(ha[g |
| .Xc |
| Goes to history number |
| .Ar n . |
| .It Xo kill\-line: |
| .No KILL Pq \*(haU |
| .Xc |
| Deletes the entire input line. |
| .It kill\-region: \*(haW |
| Deletes the input between the cursor and the mark. |
| .It Xo kill\-to\-eol: |
| .Op Ar n |
| .No \*(haK |
| .Xc |
| Deletes the input from the cursor to the end of the line if |
| .Ar n |
| is not specified; otherwise deletes characters between the cursor and column |
| .Ar n . |
| .It list: \*(ha[? |
| Prints a sorted, columnated list of command names or file names (if any) that |
| can complete the partial word containing the cursor. |
| Directory names have |
| .Ql / |
| appended to them. |
| .It list\-command: \*(haX? |
| Prints a sorted, columnated list of command names (if any) that can complete |
| the partial word containing the cursor. |
| .It list\-file: \*(haX\*(haY |
| 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 |
| .Ic list |
| above. |
| .It newline: \*(haJ , \*(haM |
| Causes the current input line to be processed by the shell. |
| The current cursor position may be anywhere on the line. |
| .It newline\-and\-next: \*(haO |
| 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 |
| .Ic up\-history , |
| .Ic search\-history |
| or |
| .Ic search\-history\-up . |
| .It Xo no\-op: |
| .No QUIT Pq \*(ha\e |
| .Xc |
| This does nothing. |
| .It prefix\-1: \*(ha[ |
| Introduces a 2-character command sequence. |
| .It prefix\-2: \*(haX , \*(ha[[ , \*(ha[O |
| Introduces a multi-character command sequence. |
| .It Xo prev\-hist\-word: |
| .Op Ar n |
| .No \*(ha[. , \*(ha[_ |
| .Xc |
| The last word or, if given, the |
| .Ar n Ns th |
| 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. |
| .It quote: \*(ha\*(ha , \*(haV |
| The following character is taken literally rather than as an editing command. |
| .It quote\-region: \*(ha[Q |
| Escapes the text between the mark and the cursor position |
| .Pq the entire line if no mark is set |
| into a shell command argument. |
| .It redraw: \*(haL |
| Reprints the last line of the prompt string and the current input line |
| on a new line. |
| .It Xo search\-character\-backward: |
| .Op Ar n |
| .No \*(ha[\*(ha] |
| .Xc |
| Search backward in the current line for the |
| .Ar n Ns th |
| occurrence of the next character typed. |
| .It Xo search\-character\-forward: |
| .Op Ar n |
| .No \*(ha] |
| .Xc |
| Search forward in the current line for the |
| .Ar n Ns th |
| occurrence of the next character typed. |
| .It search\-history: \*(haR |
| Enter incremental search mode. |
| The internal history list is searched |
| backwards for commands matching the input. |
| An initial |
| .Ql \*(ha |
| in the search string anchors the search. |
| The escape key will leave search mode. |
| Other commands, including sequences of escape as |
| .Ic prefix\-1 |
| followed by a |
| .Ic prefix\-1 |
| or |
| .Ic prefix\-2 |
| key will be executed after leaving search mode. |
| The |
| .Ic abort Pq \*(haG |
| command will restore the input line before search started. |
| Successive |
| .Ic 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 necessary. |
| .It 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 cursor. |
| When used on an empty line, this has the same effect as |
| .Ic up\-history . |
| .It 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 cursor. |
| When used on an empty line, this has the same effect as |
| .Ic down\-history . |
| This is only useful after an |
| .Ic up\-history , |
| .Ic search\-history |
| or |
| .Ic search\-history\-up . |
| .It set\-mark\-command: \*(ha[ Ns Aq space |
| Set the mark at the cursor position. |
| .It transpose\-chars: \*(haT |
| If at the end of line or, if the |
| .Ic gmacs |
| option is set, this exchanges the two previous characters; otherwise, it |
| exchanges the previous and current characters and moves the cursor one |
| character to the right. |
| .It Xo up\-history: |
| .Op Ar n |
| .No \*(haP , \*(haXA , ANSI-CurUp , PC-CurUp |
| .Xc |
| Scrolls the history buffer backward |
| .Ar n |
| lines (earlier). |
| .It Xo upcase\-word: |
| .Op Ar n |
| .No \*(ha[U , \*(ha[u |
| .Xc |
| Uppercase the next |
| .Ar n |
| words. |
| .It version: \*(ha[\*(haV |
| Display the version of |
| .Nm mksh . |
| The current edit buffer is restored as soon as a key is pressed. |
| The restoring keypress is processed, unless it is a space. |
| .It yank: \*(haY |
| Inserts the most recently killed text string at the current cursor position. |
| .It yank\-pop: \*(ha[y |
| Immediately after a |
| .Ic yank , |
| replaces the inserted text string with the next previously killed text string. |
| .El |
| .Pp |
| The tab completion escapes characters the same way as the following code: |
| .Bd -literal |
| print \-nr \-\- "${x@/[\e"\-\e$\e&\-*:\-?[\e\e\e`\e{\-\e}${IFS\-$\*(aq \et\en\*(aq}]/\e\e$KSH_MATCH}" |
| .Ed |
| .Ss Vi editing mode |
| .Em 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. |
| .Pp |
| The vi command-line editor in |
| .Nm |
| has basically the same commands as the |
| .Xr vi 1 |
| editor with the following exceptions: |
| .Bl -bullet |
| .It |
| You start out in insert mode. |
| .It |
| There are file name and command completion commands: |
| =, \e, *, \*(haX, \*(haE, \*(haF and, optionally, |
| .Aq Tab |
| and |
| .Aq Esc . |
| .It |
| The |
| .Ic _ |
| command is different (in |
| .Nm mksh , |
| it is the last argument command; in |
| .Xr vi 1 |
| it goes to the start of the current line). |
| .It |
| The |
| .Ic / |
| and |
| .Ic G |
| commands move in the opposite direction to the |
| .Ic j |
| command. |
| .It |
| Commands which don't make sense in a single line editor are not available |
| (e.g. screen movement commands and |
| .Xr ex 1 Ns -style |
| colon |
| .Pq Ic \&: |
| commands). |
| .El |
| .Pp |
| Like |
| .Xr vi 1 , |
| there are two modes: |
| .Dq insert |
| mode and |
| .Dq command |
| mode. |
| In insert mode, most characters are simply put in the buffer at the |
| current cursor position as they are typed; however, some characters are |
| treated specially. |
| In particular, the following characters are taken from current |
| .Xr tty 4 |
| settings |
| (see |
| .Xr stty 1 ) |
| and have their usual meaning (normal values are in parentheses): kill (\*(haU), |
| erase (\*(ha?), werase (\*(haW), eof (\*(haD), intr (\*(haC) and quit (\*(ha\e). |
| In addition to |
| the above, the following characters are also treated specially in insert mode: |
| .Bl -tag -width XJXXXXM |
| .It \*(haE |
| Command and file name enumeration (see below). |
| .It \*(haF |
| 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. |
| .It \*(haH |
| Erases previous character. |
| .It \*(haJ \*(Ba \*(haM |
| End of line. |
| The current line is read, parsed and executed by the shell. |
| .It \*(haV |
| Literal next. |
| The next character typed is not treated specially (can be used |
| to insert the characters being described here). |
| .It \*(haX |
| Command and file name expansion (see below). |
| .It Aq Esc |
| Puts the editor in command mode (see below). |
| .It Aq Tab |
| Optional file name and command completion (see |
| .Ic \*(haF |
| above), enabled with |
| .Ic set Fl o Ic vi\-tabcomplete . |
| .El |
| .Pp |
| In command mode, each character is interpreted as a command. |
| Characters 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 |
| .Op Ar n |
| indicates the command may be prefixed by a number (e.g.\& |
| .Ic 10l |
| moves right 10 characters); if no number prefix is used, |
| .Ar n |
| is assumed to be 1 unless otherwise specified. |
| The term |
| .Dq current position |
| refers to the position between the cursor and the character preceding the |
| cursor. |
| A |
| .Dq word |
| is a sequence of letters, digits and underscore characters or a sequence of |
| non-letter, non-digit, non-underscore and non-whitespace characters (e.g.\& |
| .Dq Li ab2*&\*(ha |
| contains two words) and a |
| .Dq big-word |
| is a sequence of non-whitespace characters. |
| .Pp |
| Special |
| .Nm |
| vi commands: |
| .Pp |
| The following commands are not in, or are different from, the normal vi file |
| editor: |
| .Bl -tag -width 10n |
| .It Xo |
| .Oo Ar n Oc Ns _ |
| .Xc |
| Insert a space followed by the |
| .Ar n Ns th |
| big-word from the last command in the history at the current position and enter |
| insert mode; if |
| .Ar n |
| is not specified, the last word is inserted. |
| .It # |
| Insert the comment character |
| .Pq Ql # |
| at the start of the current line and return the line to the shell (equivalent |
| to |
| .Ic I#\*(haJ ) . |
| .It Xo |
| .Oo Ar n Oc Ns g |
| .Xc |
| Like |
| .Ic G , |
| except if |
| .Ar n |
| is not specified, it goes to the most recent remembered line. |
| .It Xo |
| .Oo Ar n Oc Ns v |
| .Xc |
| Internally run the command |
| .Ic fc \-e \&"${VISUAL:\-${EDITOR:\-vi}}" Fl \- Ar n |
| .br |
| on a temporary script file to interactively edit line |
| .Ar n |
| (if |
| .Ar 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 |
| .Pq resulting |
| and original lines are added onto history. |
| .It * and \*(haX |
| Command or file name expansion is applied to the current big-word (with an |
| appended |
| .Ql * |
| if the word contains no file globbing characters)\*(EMthe 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 |
| .Ql \&; , |
| .Ql \*(Ba , |
| .Ql & , |
| .Ql \&( |
| or |
| .Ql \&) |
| and does not contain a slash |
| .Pq Ql / , |
| 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 executable files found by searching the |
| directories in the |
| .Ev PATH |
| parameter. |
| File name expansion matches the big-word against the files in the |
| current directory. |
| After expansion, the cursor is placed just past the last |
| word and the editor is in insert mode. |
| .It Xo |
| .Oo Ar n Oc Ns \e , |
| .Oo Ar n Oc Ns \*(haF , |
| .Oo Ar n Oc Ns Aq Tab , |
| .No and |
| .Oo Ar n Oc Ns Aq Esc |
| .Xc |
| Command/file name completion. |
| Replace the current big-word with the |
| longest unique match obtained after performing command and file name expansion. |
| .Aq Tab |
| is only recognised if the |
| .Ic vi\-tabcomplete |
| option is set, while |
| .Aq Esc |
| is only recognised if the |
| .Ic vi\-esccomplete |
| option is set (see |
| .Ic set Fl o ) . |
| If |
| .Ar n |
| is specified, the |
| .Ar n Ns th |
| possible completion is selected (as reported by the command/file name |
| enumeration command). |
| .It = and \*(haE |
| Command/file name enumeration. |
| List all the commands or files that match the current big-word. |
| .It \*(haV |
| Display the version of |
| .Nm mksh . |
| The current edit buffer is restored as soon as a key is pressed. |
| The restoring keypress is ignored. |
| .It @ Ns Ar c |
| Macro expansion. |
| Execute the commands found in the alias |
| .Li _ Ns Ar c . |
| .El |
| .Pp |
| Intra-line movement commands: |
| .Bl -tag -width Ds |
| .It Xo |
| .Oo Ar n Oc Ns h and |
| .Oo Ar n Oc Ns \*(haH |
| .Xc |
| Move left |
| .Ar n |
| characters. |
| .It Xo |
| .Oo Ar n Oc Ns l and |
| .Oo Ar n Oc Ns Aq space |
| .Xc |
| Move right |
| .Ar n |
| characters. |
| .It 0 |
| Move to column 0. |
| .It \*(ha |
| Move to the first non-whitespace character. |
| .It Xo |
| .Oo Ar n Oc Ns \*(Ba |
| .Xc |
| Move to column |
| .Ar n . |
| .It $ |
| Move to the last character. |
| .It Xo |
| .Oo Ar n Oc Ns b |
| .Xc |
| Move back |
| .Ar n |
| words. |
| .It Xo |
| .Oo Ar n Oc Ns B |
| .Xc |
| Move back |
| .Ar n |
| big-words. |
| .It Xo |
| .Oo Ar n Oc Ns e |
| .Xc |
| Move forward to the end of the word, |
| .Ar n |
| times. |
| .It Xo |
| .Oo Ar n Oc Ns E |
| .Xc |
| Move forward to the end of the big-word, |
| .Ar n |
| times. |
| .It Xo |
| .Oo Ar n Oc Ns w |
| .Xc |
| Move forward |
| .Ar n |
| words. |
| .It Xo |
| .Oo Ar n Oc Ns W |
| .Xc |
| Move forward |
| .Ar n |
| big-words. |
| .It % |
| Find match. |
| The editor looks forward for the nearest parenthesis, bracket or |
| brace and then moves the cursor to the matching parenthesis, bracket or brace. |
| .It Xo |
| .Oo Ar n Oc Ns f Ns Ar c |
| .Xc |
| Move forward to the |
| .Ar n Ns th |
| occurrence of the character |
| .Ar c . |
| .It Xo |
| .Oo Ar n Oc Ns F Ns Ar c |
| .Xc |
| Move backward to the |
| .Ar n Ns th |
| occurrence of the character |
| .Ar c . |
| .It Xo |
| .Oo Ar n Oc Ns t Ns Ar c |
| .Xc |
| Move forward to just before the |
| .Ar n Ns th |
| occurrence of the character |
| .Ar c . |
| .It Xo |
| .Oo Ar n Oc Ns T Ns Ar c |
| .Xc |
| Move backward to just before the |
| .Ar n Ns th |
| occurrence of the character |
| .Ar c . |
| .It Xo |
| .Oo Ar n Oc Ns \&; |
| .Xc |
| Repeats the last |
| .Ic f , F , t |
| or |
| .Ic T |
| command. |
| .It Xo |
| .Oo Ar n Oc Ns \&, |
| .Xc |
| Repeats the last |
| .Ic f , F , t |
| or |
| .Ic T |
| command, but moves in the opposite direction. |
| .El |
| .Pp |
| Inter-line movement commands: |
| .Bl -tag -width Ds |
| .It Xo |
| .Oo Ar n Oc Ns j , |
| .Oo Ar n Oc Ns + , |
| .No and |
| .Oo Ar n Oc Ns \*(haN |
| .Xc |
| Move to the |
| .Ar n Ns th |
| next line in the history. |
| .It Xo |
| .Oo Ar n Oc Ns k , |
| .Oo Ar n Oc Ns \- , |
| .No and |
| .Oo Ar n Oc Ns \*(haP |
| .Xc |
| Move to the |
| .Ar n Ns th |
| previous line in the history. |
| .It Xo |
| .Oo Ar n Oc Ns G |
| .Xc |
| Move to line |
| .Ar n |
| in the history; if |
| .Ar n |
| is not specified, the number of the first remembered line is used. |
| .It Xo |
| .Oo Ar n Oc Ns g |
| .Xc |
| Like |
| .Ic G , |
| except if |
| .Ar n |
| is not specified, it goes to the most recent remembered line. |
| .It Xo |
| .Oo Ar n Oc Ns / Ns Ar string |
| .Xc |
| Search backward through the history for the |
| .Ar n Ns th |
| line containing |
| .Ar string ; |
| if |
| .Ar string |
| starts with |
| .Ql \*(ha , |
| the remainder of the string must appear at the start of the history line for |
| it to match. |
| .It Xo |
| .Oo Ar n Oc Ns \&? Ns Ar string |
| .Xc |
| Same as |
| .Ic / , |
| except it searches forward through the history. |
| .It Xo |
| .Oo Ar n Oc Ns n |
| .Xc |
| Search for the |
| .Ar n Ns th |
| occurrence of the last search string; |
| the direction of the search is the same as the last search. |
| .It Xo |
| .Oo Ar n Oc Ns N |
| .Xc |
| Search for the |
| .Ar n Ns th |
| occurrence of the last search string; |
| the direction of the search is the opposite of the last search. |
| .It Ar ANSI-CurUp , PC-PgUp |
| Take the characters from the beginning of the line to the current |
| cursor position as search string and do a history search, backwards, |
| for lines beginning with this string; keep the cursor position. |
| This works only in insert mode and keeps it enabled. |
| .It Ar ANSI-CurDown , PC-PgDn |
| Take the characters from the beginning of the line to the current |
| 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. |
| .El |
| .Pp |
| Edit commands |
| .Bl -tag -width Ds |
| .It Xo |
| .Oo Ar n Oc Ns a |
| .Xc |
| Append text |
| .Ar n |
| times; goes into insert mode just after the current position. |
| The append is |
| only replicated if command mode is re-entered i.e.\& |
| .Aq Esc |
| is used. |
| .It Xo |
| .Oo Ar n Oc Ns A |
| .Xc |
| Same as |
| .Ic a , |
| except it appends at the end of the line. |
| .It Xo |
| .Oo Ar n Oc Ns i |
| .Xc |
| Insert text |
| .Ar n |
| times; goes into insert mode at the current position. |
| The insertion is only |
| replicated if command mode is re-entered i.e.\& |
| .Aq Esc |
| is used. |
| .It Xo |
| .Oo Ar n Oc Ns I |
| .Xc |
| Same as |
| .Ic i , |
| except the insertion is done just before the first non-blank character. |
| .It Xo |
| .Oo Ar n Oc Ns s |
| .Xc |
| Substitute the next |
| .Ar n |
| characters (i.e. delete the characters and go into insert mode). |
| .It 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. |
| .It Xo |
| .Oo Ar n Oc Ns c Ns Ar move-cmd |
| .Xc |
| Change from the current position to the position resulting from |
| .Ar n move-cmd Ns s |
| (i.e. delete the indicated region and go into insert mode); if |
| .Ar move-cmd |
| is |
| .Ic c , |
| the line starting from the first non-blank character is changed. |
| .It 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). |
| .It Xo |
| .Oo Ar n Oc Ns x |
| .Xc |
| Delete the next |
| .Ar n |
| characters. |
| .It Xo |
| .Oo Ar n Oc Ns X |
| .Xc |
| Delete the previous |
| .Ar n |
| characters. |
| .It D |
| Delete to the end of the line. |
| .It Xo |
| .Oo Ar n Oc Ns d Ns Ar move-cmd |
| .Xc |
| Delete from the current position to the position resulting from |
| .Ar n move-cmd Ns s ; |
| .Ar move-cmd |
| is a movement command (see above) or |
| .Ic d , |
| in which case the current line is deleted. |
| .It Xo |
| .Oo Ar n Oc Ns r Ns Ar c |
| .Xc |
| Replace the next |
| .Ar n |
| characters with the character |
| .Ar c . |
| .It Xo |
| .Oo Ar n Oc Ns R |
| .Xc |
| Replace. |
| Enter insert mode but overwrite existing characters instead of |
| inserting before existing characters. |
| The replacement is repeated |
| .Ar n |
| times. |
| .It Xo |
| .Oo Ar n Oc Ns \*(TI |
| .Xc |
| Change the case of the next |
| .Ar n |
| characters. |
| .It Xo |
| .Oo Ar n Oc Ns y Ns Ar move-cmd |
| .Xc |
| Yank from the current position to the position resulting from |
| .Ar n move-cmd Ns s |
| into the yank buffer; if |
| .Ar move-cmd |
| is |
| .Ic y , |
| the whole line is yanked. |
| .It Y |
| Yank from the current position to the end of the line. |
| .It Xo |
| .Oo Ar n Oc Ns p |
| .Xc |
| Paste the contents of the yank buffer just after the current position, |
| .Ar n |
| times. |
| .It Xo |
| .Oo Ar n Oc Ns P |
| .Xc |
| Same as |
| .Ic p , |
| except the buffer is pasted at the current position. |
| .El |
| .Pp |
| Miscellaneous vi commands |
| .Bl -tag -width Ds |
| .It \*(haJ and \*(haM |
| The current line is read, parsed and executed by the shell. |
| .It \*(haL and \*(haR |
| Redraw the current line. |
| .It Xo |
| .Oo Ar n Oc Ns \&. |
| .Xc |
| Redo the last edit command |
| .Ar n |
| times. |
| .It u |
| Undo the last edit command. |
| .It U |
| Undo all changes that have been made to the current line. |
| .It PC Home, End, Del and cursor keys |
| They move as expected, both in insert and command mode. |
| .It Ar intr No and Ar quit |
| The interrupt and quit terminal characters cause the current line to be |
| removed to the history and a new prompt to be printed. |
| .El |
| .Sh FILES |
| .Bl -tag -width XetcXsuid_profile -compact |
| .It Pa \*(TI/.mkshrc |
| User mkshrc profile (non-privileged interactive shells); see |
| .Sx Startup files. |
| The location can be changed at compile time (e.g. for embedded systems); |
| AOSP Android builds use |
| .Pa /system/etc/mkshrc . |
| .It Pa \*(TI/.profile |
| User profile (non-privileged login shells); see |
| .Sx Startup files |
| near the top of this manual. |
| .It Pa /etc/profile |
| System profile (login shells); see |
| .Sx Startup files. |
| .It Pa /etc/shells |
| Shell database. |
| .It Pa /etc/suid_profile |
| Privileged shells' profile (sugid); see |
| .Sx Startup files. |
| .El |
| .Pp |
| Note: On Android, |
| .Pa /system/etc/ |
| contains the system and suid profile. |
| .Sh SEE ALSO |
| .Xr awk 1 , |
| .Xr cat 1 , |
| .Xr ed 1 , |
| .Xr getopt 1 , |
| .Xr lksh 1 , |
| .Xr sed 1 , |
| .Xr sh 1 , |
| .Xr stty 1 , |
| .Xr dup 2 , |
| .Xr execve 2 , |
| .Xr getgid 2 , |
| .Xr getuid 2 , |
| .Xr mknod 2 , |
| .Xr mkfifo 2 , |
| .Xr open 2 , |
| .Xr pipe 2 , |
| .Xr rename 2 , |
| .Xr wait 2 , |
| .Xr getopt 3 , |
| .Xr nl_langinfo 3 , |
| .Xr setlocale 3 , |
| .Xr signal 3 , |
| .Xr system 3 , |
| .Xr tty 4 , |
| .Xr shells 5 , |
| .Xr environ 7 , |
| .Xr script 7 , |
| .Xr utf\-8 7 , |
| .Xr mknod 8 |
| .Pp |
| The FAQ at |
| .Pa http://www.mirbsd.org/mksh\-faq.htm |
| or in the |
| .Pa mksh.faq |
| file. |
| .Pp |
| .Pa http://www.mirbsd.org/ksh\-chan.htm |
| .Rs |
| .%A Morris Bolsky |
| .%B "The KornShell Command and Programming Language" |
| .%D 1989 |
| .%I "Prentice Hall PTR" |
| .%P "xvi\ +\ 356 pages" |
| .%O "ISBN 978\-0\-13\-516972\-8 (0\-13\-516972\-0)" |
| .Re |
| .Rs |
| .%A Morris I. Bolsky |
| .%A David G. Korn |
| .%B "The New KornShell Command and Programming Language (2nd Edition)" |
| .%D 1995 |
| .%I "Prentice Hall PTR" |
| .%P "xvi\ +\ 400 pages" |
| .%O "ISBN 978\-0\-13\-182700\-4 (0\-13\-182700\-6)" |
| .Re |
| .Rs |
| .%A Stephen G. Kochan |
| .%A Patrick H. Wood |
| .%B "\\*(tNUNIX\\*(sP Shell Programming" |
| .%V "3rd Edition" |
| .%D 2003 |
| .%I "Sams" |
| .%P "xiii\ +\ 437 pages" |
| .%O "ISBN 978\-0\-672\-32490\-1 (0\-672\-32490\-3)" |
| .Re |
| .Rs |
| .%A "IEEE Inc." |
| .%T "\\*(tNIEEE\\*(sP Standard for Information Technology\*(EMPortable Operating System Interface (POSIX)" |
| .%V "Part 2: Shell and Utilities" |
| .%D 1993 |
| .%I "IEEE Press" |
| .%P "xvii\ +\ 1195 pages" |
| .%O "ISBN 978\-1\-55937\-255\-8 (1\-55937\-255\-9)" |
| .Re |
| .Rs |
| .%A Bill Rosenblatt |
| .%B "Learning the Korn Shell" |
| .%D 1993 |
| .%I "O'Reilly" |
| .%P "360 pages" |
| .%O "ISBN 978\-1\-56592\-054\-5 (1\-56592\-054\-6)" |
| .Re |
| .Rs |
| .%A Bill Rosenblatt |
| .%A Arnold Robbins |
| .%B "Learning the Korn Shell, Second Edition" |
| .%D 2002 |
| .%I "O'Reilly" |
| .%P "432 pages" |
| .%O "ISBN 978\-0\-596\-00195\-7 (0\-596\-00195\-9)" |
| .Re |
| .Rs |
| .%A Barry Rosenberg |
| .%B "KornShell Programming Tutorial" |
| .%D 1991 |
| .%I "Addison-Wesley Professional" |
| .%P "xxi\ +\ 324 pages" |
| .%O "ISBN 978\-0\-201\-56324\-5 (0\-201\-56324\-X)" |
| .Re |
| .Sh AUTHORS |
| .An -nosplit |
| .Nm "The MirBSD Korn Shell" |
| is developed by |
| .An mirabilos Aq Mt [email protected] |
| as part of The MirOS Project. |
| This shell is based on the public domain 7th edition Bourne shell clone by |
| .An 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 |
| .An Doug A. Gwyn , |
| .An Doug Kingston , |
| .An Ron Natalie , |
| .An Arnold Robbins , |
| .An Lou Salkind |
| and others. |
| The first release of |
| .Nm pdksh |
| was created by |
| .An Eric Gisin , |
| and it was subsequently maintained by |
| .An John R. MacMillan , |
| .An Simon J. Gerraty |
| and |
| .An 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. |
| .Pp |
| .Nm mksh\-os2 |
| is developed by |
| .An KO Myung-Hun Aq Mt [email protected] . |
| .Pp |
| .Nm mksh\-w32 |
| is developed by |
| .An Michael Langguth Aq Mt [email protected] . |
| .Pp |
| .Nm mksh Ns / Ns Tn z/OS |
| is contributed by |
| .An Daniel Richard G. Aq Mt [email protected] . |
| .Pp |
| The BSD daemon is Copyright \(co Marshall Kirk McKusick. |
| The complete legalese is at: |
| .Pa http://www.mirbsd.org/TaC\-mksh.txt |
| .\" |
| .\" This boils down to: feel free to use mksh.ico as application icon |
| .\" or shortcut for mksh or mksh/Win32 or OS/2; distro patches are ok |
| .\" (but we request they amend $KSH_VERSION when modifying mksh). |
| .\" Authors are Marshall Kirk McKusick (UCB), Rick Collette (ekkoBSD), |
| .\" mirabilos, Benny Siegert (MirBSD), Michael Langguth (mksh/Win32), |
| .\" KO Myung-Hun (mksh for OS/2). |
| .\" |
| .\" As far as MirBSD is concerned, the files themselves are free |
| .\" to modification and distribution under BSD/MirOS Licence, the |
| .\" restriction on use stems only from trademark law's requirement |
| .\" to protect it or lose it, which McKusick almost did. |
| .\" |
| .Sh CAVEATS |
| .Nm mksh |
| provides a consistent, clear interface normally. |
| This may deviate from POSIX in historic or opinionated places. |
| .Ic set Fl o Ic posix |
| (see |
| .Sx POSIX mode |
| for details) |
| will make the shell more conformant, but mind the FAQ (see |
| .Sx SEE ALSO ) , |
| especially regarding locales. |
| .Nm mksh |
| .Pq but not Nm lksh |
| provides a consistent 32-bit integer arithmetic implementation, both |
| signed and unsigned, with sign of the result of a remainder operation |
| and wraparound defined, even (defying POSIX) on 36-bit and 64-bit systems. |
| .Pp |
| .Nm 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 purpose. |
| .Sh BUGS |
| Suspending (using \*(haZ) pipelines like the one below will only suspend |
| the currently running part of the pipeline; in this example, |
| .Dq Li fubar |
| is immediately printed on suspension (but not later after an |
| .Ic fg ) . |
| .Bd -literal -offset indent |
| $ /bin/sleep 666 && echo fubar |
| .Ed |
| .Pp |
| The truncation process involved when changing |
| .Ev 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 entries from the persistent |
| history file; truncating the on-disc file to |
| .Ev HISTSIZE |
| lines has always been broken and prone to history file corruption |
| when multiple shells are accessing the file; the rollover process |
| for the in-memory portion of the history is slow, should use |
| .Xr memmove 3 . |
| .Pp |
| This document attempts to describe |
| .Nm mksh\ R59c |
| and up, |
| .\" with vendor patches from insert-your-name-here, |
| compiled without any options impacting functionality, such as |
| .Dv MKSH_SMALL , |
| when not called as |
| .Pa /bin/sh |
| which, on some systems only, enables |
| .Ic set Fl o Ic posix |
| or |
| .Ic set Fl o Ic sh |
| automatically (whose behaviour differs across targets), |
| for an operating environment supporting all of its advanced needs. |
| .Pp |
| Please report bugs in |
| .Nm |
| to the public development mailing list at |
| .Aq Mt miros\[email protected] |
| (please note the EU-DSGVO/GDPR notice on |
| .Pa http://www.mirbsd.org/rss.htm#lists |
| and in the SMTP banner!) or in the |
| .Li \&#\&!/bin/mksh |
| .Pq or Li \&#ksh |
| IRC channel at |
| .Pa irc.freenode.net |
| .Pq Port 6697 SSL, 6667 unencrypted , |
| or at: |
| .Pa https://launchpad.net/mksh |