blob: 2e834288ce4c1c046d8a630188c1c5542f5100c4 [file] [log] [blame]
Elliott Hughes47086262019-03-26 12:34:31 -07001.\" $MirOS: src/bin/mksh/mksh.1,v 1.463 2019/03/01 16:17:31 tg Exp $
Elliott Hughes96b43632015-07-17 11:39:41 -07002.\" $OpenBSD: ksh.1,v 1.160 2015/07/04 13:27:04 feinerer Exp $
Geremy Condra03ebf062011-10-12 18:17:24 -07003.\"-
4.\" Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
Elliott Hughes47086262019-03-26 12:34:31 -07005.\" 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
6.\" 2018, 2019
Elliott Hughesfc0307d2016-02-02 15:26:47 -08007.\" mirabilos <m@mirbsd.org>
Geremy Condra03ebf062011-10-12 18:17:24 -07008.\"
9.\" Provided that these terms and disclaimer and all copyright notices
10.\" are retained or reproduced in an accompanying document, permission
11.\" is granted to deal in this work without restriction, including un‐
12.\" limited rights to use, publicly perform, distribute, sell, modify,
13.\" merge, give away, or sublicence.
14.\"
15.\" This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
16.\" the utmost extent permitted by applicable law, neither express nor
17.\" implied; without malicious intent or gross negligence. In no event
18.\" may a licensor, author or contributor be held liable for indirect,
19.\" direct, other damage, loss, or other issues arising in any way out
20.\" of dealing in the work, even if advised of the possibility of such
21.\" damage or existence of a defect, except proven that it results out
22.\" of said person’s immediate fault when using the work as intended.
23.\"-
24.\" Try to make GNU groff and AT&T nroff more compatible
25.\" * ` generates ‘ in gnroff, so use \`
26.\" * ' generates ’ in gnroff, \' generates ´, so use \*(aq
27.\" * - generates ‐ in gnroff, \- generates −, so .tr it to -
28.\" thus use - for hyphens and \- for minus signs and option dashes
29.\" * ~ is size-reduced and placed atop in groff, so use \*(TI
30.\" * ^ is size-reduced and placed atop in groff, so use \*(ha
31.\" * \(en does not work in nroff, so use \*(en
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +000032.\" * <>| are problematic, so redefine and use \*(Lt\*(Gt\*(Ba
Elliott Hughes77740fc2016-08-12 15:06:53 -070033.\" Also make sure to use \& *before* a punctuation char that is to not
34.\" be interpreted as punctuation, and especially with two-letter words
35.\" but also (after) a period that does not end a sentence (“e.g.\&”).
Geremy Condra03ebf062011-10-12 18:17:24 -070036.\" The section after the "doc" macropackage has been loaded contains
37.\" additional code to convene between the UCB mdoc macropackage (and
38.\" its variant as BSD mdoc in groff) and the GNU mdoc macropackage.
39.\"
40.ie \n(.g \{\
41. if \*[.T]ascii .tr \-\N'45'
42. if \*[.T]latin1 .tr \-\N'45'
43. if \*[.T]utf8 .tr \-\N'45'
44. ds <= \[<=]
45. ds >= \[>=]
46. ds Rq \[rq]
47. ds Lq \[lq]
48. ds sL \(aq
49. ds sR \(aq
50. if \*[.T]utf8 .ds sL `
51. if \*[.T]ps .ds sL `
52. if \*[.T]utf8 .ds sR '
53. if \*[.T]ps .ds sR '
54. ds aq \(aq
55. ds TI \(ti
56. ds ha \(ha
57. ds en \(en
58.\}
59.el \{\
60. ds aq '
61. ds TI ~
62. ds ha ^
63. ds en \(em
64.\}
65.\"
66.\" Implement .Dd with the Mdocdate RCS keyword
67.\"
68.rn Dd xD
69.de Dd
70.ie \\$1$Mdocdate: \{\
71. xD \\$2 \\$3, \\$4
72.\}
73.el .xD \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
74..
75.\"
76.\" .Dd must come before definition of .Mx, because when called
77.\" with -mandoc, it might implement .Mx itself, but we want to
78.\" use our own definition. And .Dd must come *first*, always.
79.\"
Elliott Hughes47086262019-03-26 12:34:31 -070080.Dd $Mdocdate: March 1 2019 $
Geremy Condra03ebf062011-10-12 18:17:24 -070081.\"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +000082.\" Check which macro package we use, and do other -mdoc setup.
Geremy Condra03ebf062011-10-12 18:17:24 -070083.\"
84.ie \n(.g \{\
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +000085. if \*[.T]utf8 .tr \[la]\*(Lt
86. if \*[.T]utf8 .tr \[ra]\*(Gt
Geremy Condra03ebf062011-10-12 18:17:24 -070087. ie d volume-ds-1 .ds tT gnu
Elliott Hughes47086262019-03-26 12:34:31 -070088. el .ie d doc-volume-ds-1 .ds tT gnp
Geremy Condra03ebf062011-10-12 18:17:24 -070089. el .ds tT bsd
90.\}
91.el .ds tT ucb
92.\"
93.\" Implement .Mx (MirBSD)
94.\"
95.ie "\*(tT"gnu" \{\
96. eo
97. de Mx
98. nr curr-font \n[.f]
99. nr curr-size \n[.ps]
100. ds str-Mx \f[\n[curr-font]]\s[\n[curr-size]u]
Elliott Hughes47086262019-03-26 12:34:31 -0700101. ds str-Mx1 \*[Tn-font-size]\%MirBSD\*[str-Mx]
Geremy Condra03ebf062011-10-12 18:17:24 -0700102. if !\n[arg-limit] \
103. if \n[.$] \{\
104. ds macro-name Mx
105. parse-args \$@
106. \}
107. if (\n[arg-limit] > \n[arg-ptr]) \{\
108. nr arg-ptr +1
109. ie (\n[type\n[arg-ptr]] == 2) \
110. as str-Mx1 \~\*[arg\n[arg-ptr]]
111. el \
112. nr arg-ptr -1
113. \}
114. ds arg\n[arg-ptr] "\*[str-Mx1]
115. nr type\n[arg-ptr] 2
116. ds space\n[arg-ptr] "\*[space]
117. nr num-args (\n[arg-limit] - \n[arg-ptr])
118. nr arg-limit \n[arg-ptr]
119. if \n[num-args] \
120. parse-space-vector
121. print-recursive
122..
123. ec
124. ds sP \s0
125. ds tN \*[Tn-font-size]
126.\}
Elliott Hughes47086262019-03-26 12:34:31 -0700127.el .ie "\*(tT"gnp" \{\
128. eo
129. de Mx
130. nr doc-curr-font \n[.f]
131. nr doc-curr-size \n[.ps]
132. ds doc-str-Mx \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]
133. ds doc-str-Mx1 \*[doc-Tn-font-size]\%MirBSD\*[doc-str-Mx]
134. if !\n[doc-arg-limit] \
135. if \n[.$] \{\
136. ds doc-macro-name Mx
137. doc-parse-args \$@
138. \}
139. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
140. nr doc-arg-ptr +1
141. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \
142. as doc-str-Mx1 \~\*[doc-arg\n[doc-arg-ptr]]
143. el \
144. nr doc-arg-ptr -1
145. \}
146. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Mx1]
147. nr doc-type\n[doc-arg-ptr] 2
148. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
149. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
150. nr doc-arg-limit \n[doc-arg-ptr]
151. if \n[doc-num-args] \
152. doc-parse-space-vector
153. doc-print-recursive
154..
155. ec
156. ds sP \s0
157. ds tN \*[doc-Tn-font-size]
158.\}
Geremy Condra03ebf062011-10-12 18:17:24 -0700159.el \{\
160. de Mx
161. nr cF \\n(.f
162. nr cZ \\n(.s
163. ds aa \&\f\\n(cF\s\\n(cZ
164. if \\n(aC==0 \{\
Elliott Hughes47086262019-03-26 12:34:31 -0700165. ie \\n(.$==0 \&MirBSD\\*(aa
Geremy Condra03ebf062011-10-12 18:17:24 -0700166. el .aV \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
167. \}
168. if \\n(aC>\\n(aP \{\
169. nr aP \\n(aP+1
170. ie \\n(C\\n(aP==2 \{\
Elliott Hughes47086262019-03-26 12:34:31 -0700171. as b1 \&MirBSD\ #\&\\*(A\\n(aP\\*(aa
Geremy Condra03ebf062011-10-12 18:17:24 -0700172. ie \\n(aC>\\n(aP \{\
173. nr aP \\n(aP+1
174. nR
175. \}
176. el .aZ
177. \}
178. el \{\
Elliott Hughes47086262019-03-26 12:34:31 -0700179. as b1 \&MirBSD\\*(aa
Geremy Condra03ebf062011-10-12 18:17:24 -0700180. nR
181. \}
182. \}
183..
184.\}
185.\"-
186.Dt MKSH 1
187.Os MirBSD
188.Sh NAME
189.Nm mksh ,
190.Nm sh
191.Nd MirBSD Korn shell
192.Sh SYNOPSIS
193.Nm
194.Bk -words
195.Op Fl +abCefhiklmnprUuvXx
Thorsten Glaser811a5752013-07-25 14:24:45 +0000196.Oo
197.Fl T Oo Ar \&! Oc Ns Ar tty
198\*(Ba
199.Ar \&\-
200.Oc
Geremy Condra03ebf062011-10-12 18:17:24 -0700201.Op Fl +o Ar option
202.Oo
203.Fl c Ar string \*(Ba
204.Fl s \*(Ba
205.Ar file
206.Op Ar argument ...
207.Oc
208.Ek
209.Nm builtin-name
210.Op Ar argument ...
211.Sh DESCRIPTION
212.Nm
213is a command interpreter intended for both interactive and shell
214script use.
215Its command language is a superset of the
216.Xr sh C
217shell language and largely compatible to the original Korn shell.
Elliott Hughesfc0307d2016-02-02 15:26:47 -0800218At times, this manual page may give scripting advice; while it
219sometimes does take portable shell scripting or various standards
220into account all information is first and foremost presented with
221.Nm
222in mind and should be taken as such.
Elliott Hughesa3c3f962017-04-12 16:52:30 -0700223.Ss I use Android, OS/2, etc. so what...?
224Please see the FAQ at the end of this document.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000225.Ss Invocation
Geremy Condra03ebf062011-10-12 18:17:24 -0700226Most builtins can be called directly, for example if a link points from its
227name to the shell; not all make sense, have been tested or work at all though.
228.Pp
229The options are as follows:
230.Bl -tag -width XcXstring
231.It Fl c Ar string
232.Nm
233will execute the command(s) contained in
234.Ar string .
235.It Fl i
236Interactive shell.
Elliott Hughes56b517d2014-10-06 11:30:44 -0700237A shell that reads commands from standard input is
Geremy Condra03ebf062011-10-12 18:17:24 -0700238.Dq interactive
239if this
240option is used or if both standard input and standard error are attached
241to a
242.Xr tty 4 .
243An interactive shell has job control enabled, ignores the
244.Dv SIGINT ,
Elliott Hughes966dd552016-12-08 15:56:04 -0800245.Dv SIGQUIT
Geremy Condra03ebf062011-10-12 18:17:24 -0700246and
247.Dv SIGTERM
248signals, and prints prompts before reading input (see the
249.Ev PS1
250and
251.Ev PS2
252parameters).
253It also processes the
254.Ev ENV
255parameter or the
256.Pa mkshrc
257file (see below).
258For non-interactive shells, the
259.Ic trackall
260option is on by default (see the
261.Ic set
262command below).
263.It Fl l
264Login shell.
265If the basename the shell is called with (i.e. argv[0])
266starts with
267.Ql \-
268or if this option is used,
269the shell is assumed to be a login shell; see
270.Sx Startup files
271below.
272.It Fl p
273Privileged shell.
274A shell is
275.Dq privileged
Elliott Hughes737fdce2014-08-07 12:59:26 -0700276if the real user ID or group ID does not match the
Geremy Condra03ebf062011-10-12 18:17:24 -0700277effective user ID or group ID (see
278.Xr getuid 2
279and
280.Xr getgid 2 ) .
281Clearing the privileged option causes the shell to set
282its effective user ID (group ID) to its real user ID (group ID).
283For further implications, see
284.Sx Startup files .
Elliott Hughes737fdce2014-08-07 12:59:26 -0700285If the shell is privileged and this flag is not explicitly set, the
286.Dq privileged
287option is cleared automatically after processing the startup files.
Geremy Condra03ebf062011-10-12 18:17:24 -0700288.It Fl r
289Restricted shell.
290A shell is
291.Dq restricted
292if this
293option is used.
294The following restrictions come into effect after the shell processes any
295profile and
296.Ev ENV
297files:
298.Pp
299.Bl -bullet -compact
300.It
301The
302.Ic cd
303.Po and Ic chdir Pc
304command is disabled.
305.It
306The
307.Ev SHELL ,
Elliott Hughes966dd552016-12-08 15:56:04 -0800308.Ev ENV
Geremy Condra03ebf062011-10-12 18:17:24 -0700309and
310.Ev PATH
311parameters cannot be changed.
312.It
313Command names can't be specified with absolute or relative paths.
314.It
315The
316.Fl p
317option of the built-in command
318.Ic command
319can't be used.
320.It
321Redirections that create files can't be used (i.e.\&
Elliott Hughes966dd552016-12-08 15:56:04 -0800322.Dq Li \*(Gt ,
323.Dq Li \*(Gt\*(Ba ,
324.Dq Li \*(Gt\*(Gt ,
325.Dq Li \*(Lt\*(Gt ) .
Geremy Condra03ebf062011-10-12 18:17:24 -0700326.El
327.It Fl s
328The shell reads commands from standard input; all non-option arguments
329are positional parameters.
Thorsten Glaser811a5752013-07-25 14:24:45 +0000330.It Fl T Ar name
Geremy Condra03ebf062011-10-12 18:17:24 -0700331Spawn
332.Nm
333on the
334.Xr tty 4
335device given.
Thorsten Glaser811a5752013-07-25 14:24:45 +0000336The paths
337.Ar name ,
338.Pa /dev/ttyC Ns Ar name
339and
340.Pa /dev/tty Ns Ar name
341are attempted in order.
342Unless
343.Ar name
344begins with an exclamation mark
Elliott Hughes966dd552016-12-08 15:56:04 -0800345.Pq Ql \&! ,
Thorsten Glaser811a5752013-07-25 14:24:45 +0000346this is done in a subshell and returns immediately.
Geremy Condra03ebf062011-10-12 18:17:24 -0700347If
Thorsten Glaser811a5752013-07-25 14:24:45 +0000348.Ar name
349is a dash
Elliott Hughes966dd552016-12-08 15:56:04 -0800350.Pq Ql \&\- ,
Thorsten Glaser811a5752013-07-25 14:24:45 +0000351detach from controlling terminal (daemonise) instead.
Geremy Condra03ebf062011-10-12 18:17:24 -0700352.El
353.Pp
354In addition to the above, the options described in the
355.Ic set
356built-in command can also be used on the command line:
357both
358.Op Fl +abCefhkmnuvXx
359and
360.Op Fl +o Ar option
361can be used for single letter or long options, respectively.
362.Pp
363If neither the
364.Fl c
365nor the
366.Fl s
367option is specified, the first non-option argument specifies the name
368of a file the shell reads commands from.
369If there are no non-option
370arguments, the shell reads commands from the standard input.
371The name of the shell (i.e. the contents of $0)
372is determined as follows: if the
373.Fl c
374option is used and there is a non-option argument, it is used as the name;
375if commands are being read from a file, the file is used as the name;
376otherwise, the basename the shell was called with (i.e. argv[0]) is used.
377.Pp
378The exit status of the shell is 127 if the command file specified on the
379command line could not be opened, or non-zero if a fatal syntax error
380occurred during the execution of a script.
381In the absence of fatal errors,
Elliott Hughes966dd552016-12-08 15:56:04 -0800382the exit status is that of the last command executed, or zero if no
Geremy Condra03ebf062011-10-12 18:17:24 -0700383command is executed.
384.Ss Startup files
385For the actual location of these files, see
386.Sx FILES .
387A login shell processes the system profile first.
388A privileged shell then processes the suid profile.
389A non-privileged login shell processes the user profile next.
390A non-privileged interactive shell checks the value of the
391.Ev ENV
392parameter after subjecting it to parameter, command, arithmetic and tilde
Elliott Hughes966dd552016-12-08 15:56:04 -0800393.Pq Ql \*(TI
Geremy Condra03ebf062011-10-12 18:17:24 -0700394substitution; if unset or empty, the user mkshrc profile is processed;
395otherwise, if a file whose name is the substitution result exists,
396it is processed; non-existence is silently ignored.
Elliott Hughes737fdce2014-08-07 12:59:26 -0700397A privileged shell then drops privileges if neither was the
398.Fl p
399option given on the command line nor set during execution of the startup files.
Geremy Condra03ebf062011-10-12 18:17:24 -0700400.Ss Command syntax
401The shell begins parsing its input by removing any backslash-newline
402combinations, then breaking it into
403.Em words .
404Words (which are sequences of characters) are delimited by unquoted whitespace
Elliott Hughes966dd552016-12-08 15:56:04 -0800405characters (space, tab and newline) or meta-characters
Geremy Condra03ebf062011-10-12 18:17:24 -0700406.Po
407.Ql \*(Lt ,
408.Ql \*(Gt ,
409.Ql \*(Ba ,
410.Ql \&; ,
411.Ql \&( ,
Elliott Hughes966dd552016-12-08 15:56:04 -0800412.Ql \&)
Geremy Condra03ebf062011-10-12 18:17:24 -0700413and
414.Ql &
415.Pc .
416Aside from delimiting words, spaces and tabs are ignored, while newlines
417usually delimit commands.
418The meta-characters are used in building the following
419.Em tokens :
Elliott Hughes966dd552016-12-08 15:56:04 -0800420.Dq Li \*(Lt ,
421.Dq Li \*(Lt& ,
422.Dq Li \*(Lt\*(Lt ,
423.Dq Li \*(Lt\*(Lt\*(Lt ,
424.Dq Li \*(Gt ,
425.Dq Li \*(Gt& ,
426.Dq Li \*(Gt\*(Gt ,
427.Dq Li &\*(Gt ,
Geremy Condra03ebf062011-10-12 18:17:24 -0700428etc. are used to specify redirections (see
429.Sx Input/output redirection
430below);
Elliott Hughes966dd552016-12-08 15:56:04 -0800431.Dq Li \*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700432is used to create pipelines;
Elliott Hughes966dd552016-12-08 15:56:04 -0800433.Dq Li \*(Ba&
Geremy Condra03ebf062011-10-12 18:17:24 -0700434is used to create co-processes (see
435.Sx Co-processes
436below);
Elliott Hughes966dd552016-12-08 15:56:04 -0800437.Dq Li \&;
Geremy Condra03ebf062011-10-12 18:17:24 -0700438is used to separate commands;
Elliott Hughes966dd552016-12-08 15:56:04 -0800439.Dq Li &
Geremy Condra03ebf062011-10-12 18:17:24 -0700440is used to create asynchronous pipelines;
Elliott Hughes966dd552016-12-08 15:56:04 -0800441.Dq Li &&
Geremy Condra03ebf062011-10-12 18:17:24 -0700442and
Elliott Hughes966dd552016-12-08 15:56:04 -0800443.Dq Li \*(Ba\*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700444are used to specify conditional execution;
Elliott Hughes966dd552016-12-08 15:56:04 -0800445.Dq Li \&;; ,
446.Dq Li \&;&
Geremy Condra03ebf062011-10-12 18:17:24 -0700447and
Elliott Hughes966dd552016-12-08 15:56:04 -0800448.Dq Li \&;\*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700449are used in
450.Ic case
451statements;
Elliott Hughes966dd552016-12-08 15:56:04 -0800452.Dq Li \&(( ... \&))
Geremy Condra03ebf062011-10-12 18:17:24 -0700453is used in arithmetic expressions;
454and lastly,
Elliott Hughes966dd552016-12-08 15:56:04 -0800455.Dq Li \&( ... \&)
Geremy Condra03ebf062011-10-12 18:17:24 -0700456is used to create subshells.
457.Pp
458Whitespace and meta-characters can be quoted individually using a backslash
Elliott Hughes966dd552016-12-08 15:56:04 -0800459.Pq Ql \e ,
Geremy Condra03ebf062011-10-12 18:17:24 -0700460or in groups using double
Elliott Hughes966dd552016-12-08 15:56:04 -0800461.Pq Ql \&"
Geremy Condra03ebf062011-10-12 18:17:24 -0700462or single
Elliott Hughes966dd552016-12-08 15:56:04 -0800463.Pq Dq Li \*(aq
Geremy Condra03ebf062011-10-12 18:17:24 -0700464quotes.
465Note that the following characters are also treated specially by the
466shell and must be quoted if they are to represent themselves:
467.Ql \e ,
468.Ql \&" ,
Elliott Hughes966dd552016-12-08 15:56:04 -0800469.Dq Li \*(aq ,
Geremy Condra03ebf062011-10-12 18:17:24 -0700470.Ql # ,
471.Ql $ ,
472.Ql \` ,
473.Ql \*(TI ,
474.Ql { ,
475.Ql } ,
476.Ql * ,
Elliott Hughes966dd552016-12-08 15:56:04 -0800477.Ql \&?
Geremy Condra03ebf062011-10-12 18:17:24 -0700478and
479.Ql \&[ .
480The first three of these are the above mentioned quoting characters (see
481.Sx Quoting
482below);
483.Ql # ,
484if used at the beginning of a word, introduces a comment \*(en everything after
485the
486.Ql #
487up to the nearest newline is ignored;
488.Ql $
Elliott Hughes966dd552016-12-08 15:56:04 -0800489is used to introduce parameter, command and arithmetic substitutions (see
Geremy Condra03ebf062011-10-12 18:17:24 -0700490.Sx Substitution
491below);
492.Ql \`
493introduces an old-style command substitution (see
494.Sx Substitution
495below);
496.Ql \*(TI
497begins a directory expansion (see
498.Sx Tilde expansion
499below);
500.Ql {
501and
502.Ql }
503delimit
504.Xr csh 1 Ns -style
Elliott Hughes96b43632015-07-17 11:39:41 -0700505alternations (see
Geremy Condra03ebf062011-10-12 18:17:24 -0700506.Sx Brace expansion
507below);
508and finally,
509.Ql * ,
Elliott Hughes966dd552016-12-08 15:56:04 -0800510.Ql \&?
Geremy Condra03ebf062011-10-12 18:17:24 -0700511and
512.Ql \&[
513are used in file name generation (see
514.Sx File name patterns
515below).
516.Pp
517As words and tokens are parsed, the shell builds commands, of which there
518are two basic types:
519.Em simple-commands ,
520typically programmes that are executed, and
521.Em compound-commands ,
522such as
523.Ic for
524and
525.Ic if
Elliott Hughes966dd552016-12-08 15:56:04 -0800526statements, grouping constructs and function definitions.
Geremy Condra03ebf062011-10-12 18:17:24 -0700527.Pp
528A simple-command consists of some combination of parameter assignments
529(see
530.Sx Parameters
531below),
532input/output redirections (see
533.Sx Input/output redirections
Elliott Hughes966dd552016-12-08 15:56:04 -0800534below)
Geremy Condra03ebf062011-10-12 18:17:24 -0700535and command words; the only restriction is that parameter assignments come
536before any command words.
537The command words, if any, define the command
538that is to be executed and its arguments.
Elliott Hughes966dd552016-12-08 15:56:04 -0800539The command may be a shell built-in command, a function
Geremy Condra03ebf062011-10-12 18:17:24 -0700540or an external command
541(i.e. a separate executable file that is located using the
542.Ev PATH
543parameter; see
544.Sx Command execution
545below).
546Note that all command constructs have an exit status: for external commands,
547this is related to the status returned by
548.Xr wait 2
549(if the command could not be found, the exit status is 127; if it could not
550be executed, the exit status is 126); the exit status of other command
551constructs (built-in commands, functions, compound-commands, pipelines, lists,
552etc.) are all well-defined and are described where the construct is
553described.
554The exit status of a command consisting only of parameter
555assignments is that of the last command substitution performed during the
556parameter assignment or 0 if there were no command substitutions.
557.Pp
558Commands can be chained together using the
Elliott Hughes966dd552016-12-08 15:56:04 -0800559.Dq Li \*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700560token to form pipelines, in which the standard output of each command but the
561last is piped (see
562.Xr pipe 2 )
563to the standard input of the following command.
Thorsten Glaser811a5752013-07-25 14:24:45 +0000564The exit status of a pipeline is that of its last command, unless the
565.Ic pipefail
566option is set (see there).
Geremy Condra03ebf062011-10-12 18:17:24 -0700567All commands of a pipeline are executed in separate subshells;
568this is allowed by POSIX but differs from both variants of
569.At
570.Nm ksh ,
571where all but the last command were executed in subshells; see the
572.Ic read
573builtin's description for implications and workarounds.
574A pipeline may be prefixed by the
Elliott Hughes966dd552016-12-08 15:56:04 -0800575.Dq Li \&!
Geremy Condra03ebf062011-10-12 18:17:24 -0700576reserved word which causes the exit status of the pipeline to be logically
577complemented: if the original status was 0, the complemented status will be 1;
578if the original status was not 0, the complemented status will be 0.
579.Pp
580.Em Lists
581of commands can be created by separating pipelines by any of the following
582tokens:
Elliott Hughes966dd552016-12-08 15:56:04 -0800583.Dq Li && ,
584.Dq Li \*(Ba\*(Ba ,
585.Dq Li & ,
586.Dq Li \*(Ba&
Geremy Condra03ebf062011-10-12 18:17:24 -0700587and
Elliott Hughes966dd552016-12-08 15:56:04 -0800588.Dq Li \&; .
Geremy Condra03ebf062011-10-12 18:17:24 -0700589The first two are for conditional execution:
590.Dq Ar cmd1 No && Ar cmd2
591executes
592.Ar cmd2
593only if the exit status of
594.Ar cmd1
595is zero;
Elliott Hughes966dd552016-12-08 15:56:04 -0800596.Dq Li \*(Ba\*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700597is the opposite \*(en
598.Ar cmd2
599is executed only if the exit status of
600.Ar cmd1
601is non-zero.
Elliott Hughes966dd552016-12-08 15:56:04 -0800602.Dq Li &&
Geremy Condra03ebf062011-10-12 18:17:24 -0700603and
Elliott Hughes966dd552016-12-08 15:56:04 -0800604.Dq Li \*(Ba\*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700605have equal precedence which is higher than that of
Elliott Hughes966dd552016-12-08 15:56:04 -0800606.Dq Li & ,
607.Dq Li \*(Ba&
Geremy Condra03ebf062011-10-12 18:17:24 -0700608and
Elliott Hughes966dd552016-12-08 15:56:04 -0800609.Dq Li \&; ,
Geremy Condra03ebf062011-10-12 18:17:24 -0700610which also have equal precedence.
611Note that the
Elliott Hughes966dd552016-12-08 15:56:04 -0800612.Dq Li &&
Geremy Condra03ebf062011-10-12 18:17:24 -0700613and
Elliott Hughes966dd552016-12-08 15:56:04 -0800614.Dq Li \*(Ba\*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700615operators are
616.Qq left-associative .
617For example, both of these commands will print only
618.Qq bar :
619.Bd -literal -offset indent
620$ false && echo foo \*(Ba\*(Ba echo bar
621$ true \*(Ba\*(Ba echo foo && echo bar
622.Ed
623.Pp
624The
Elliott Hughes966dd552016-12-08 15:56:04 -0800625.Dq Li &
Geremy Condra03ebf062011-10-12 18:17:24 -0700626token causes the preceding command to be executed asynchronously; that is,
627the shell starts the command but does not wait for it to complete (the shell
628does keep track of the status of asynchronous commands; see
629.Sx Job control
630below).
631When an asynchronous command is started when job control is disabled
632(i.e. in most scripts), the command is started with signals
633.Dv SIGINT
634and
635.Dv SIGQUIT
636ignored and with input redirected from
637.Pa /dev/null
638(however, redirections specified in the asynchronous command have precedence).
639The
Elliott Hughes966dd552016-12-08 15:56:04 -0800640.Dq Li \*(Ba&
Geremy Condra03ebf062011-10-12 18:17:24 -0700641operator starts a co-process which is a special kind of asynchronous process
642(see
643.Sx Co-processes
644below).
645Note that a command must follow the
Elliott Hughes966dd552016-12-08 15:56:04 -0800646.Dq Li &&
Geremy Condra03ebf062011-10-12 18:17:24 -0700647and
Elliott Hughes966dd552016-12-08 15:56:04 -0800648.Dq Li \*(Ba\*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700649operators, while it need not follow
Elliott Hughes966dd552016-12-08 15:56:04 -0800650.Dq Li & ,
651.Dq Li \*(Ba&
Geremy Condra03ebf062011-10-12 18:17:24 -0700652or
Elliott Hughes966dd552016-12-08 15:56:04 -0800653.Dq Li \&; .
Geremy Condra03ebf062011-10-12 18:17:24 -0700654The exit status of a list is that of the last command executed, with the
655exception of asynchronous lists, for which the exit status is 0.
656.Pp
657Compound commands are created using the following reserved words.
658These words
659are only recognised if they are unquoted and if they are used as the first
660word of a command (i.e. they can't be preceded by parameter assignments or
661redirections):
662.Bd -literal -offset indent
663case else function then ! (
664do esac if time [[ ((
665done fi in until {
666elif for select while }
667.Ed
668.Pp
669In the following compound command descriptions, command lists (denoted as
670.Em list )
Elliott Hughes966dd552016-12-08 15:56:04 -0800671that are followed by reserved words must end with a semicolon, a newline or
Geremy Condra03ebf062011-10-12 18:17:24 -0700672a (syntactically correct) reserved word.
673For example, the following are all valid:
674.Bd -literal -offset indent
675$ { echo foo; echo bar; }
676$ { echo foo; echo bar\*(Ltnewline\*(Gt}
677$ { { echo foo; echo bar; } }
678.Ed
679.Pp
680This is not valid:
681.Pp
682.Dl $ { echo foo; echo bar }
683.Bl -tag -width 4n
684.It Pq Ar list
685Execute
686.Ar list
687in a subshell.
688There is no implicit way to pass environment changes from a
689subshell back to its parent.
690.It { Ar list ; No }
691Compound construct;
692.Ar list
693is executed, but not in a subshell.
694Note that
Elliott Hughes966dd552016-12-08 15:56:04 -0800695.Dq Li {
Geremy Condra03ebf062011-10-12 18:17:24 -0700696and
Elliott Hughes966dd552016-12-08 15:56:04 -0800697.Dq Li }
Geremy Condra03ebf062011-10-12 18:17:24 -0700698are reserved words, not meta-characters.
699.It Xo case Ar word No in
700.Oo Op \&(
701.Ar pattern
Elliott Hughes50012062015-03-10 22:22:24 -0700702.Op \*(Ba Ar pattern
Geremy Condra03ebf062011-10-12 18:17:24 -0700703.No ... Ns )
704.Ar list
Elliott Hughes50012062015-03-10 22:22:24 -0700705.Ic terminator
706.Oc No ... esac
Geremy Condra03ebf062011-10-12 18:17:24 -0700707.Xc
708The
709.Ic case
710statement attempts to match
711.Ar word
712against a specified
713.Ar pattern ;
714the
715.Ar list
716associated with the first successfully matched pattern is executed.
717Patterns used in
718.Ic case
719statements are the same as those used for file name patterns except that the
720restrictions regarding
721.Ql \&.
722and
723.Ql /
724are dropped.
725Note that any unquoted space before and after a pattern is
726stripped; any space within a pattern must be quoted.
727Both the word and the
Elliott Hughes966dd552016-12-08 15:56:04 -0800728patterns are subject to parameter, command and arithmetic substitution, as
Geremy Condra03ebf062011-10-12 18:17:24 -0700729well as tilde substitution.
730.Pp
731For historical reasons, open and close braces may be used instead of
732.Ic in
733and
734.Ic esac
735e.g.\&
Elliott Hughes50012062015-03-10 22:22:24 -0700736.Ic case $foo { *) echo bar ;; } .
Geremy Condra03ebf062011-10-12 18:17:24 -0700737.Pp
Elliott Hughes50012062015-03-10 22:22:24 -0700738The list
739.Ic terminator Ns s
740are:
Geremy Condra03ebf062011-10-12 18:17:24 -0700741.Bl -tag -width 4n
Elliott Hughes966dd552016-12-08 15:56:04 -0800742.It Dq Li ;;
Geremy Condra03ebf062011-10-12 18:17:24 -0700743Terminate after the list.
Elliott Hughes966dd552016-12-08 15:56:04 -0800744.It Dq Li \&;&
Geremy Condra03ebf062011-10-12 18:17:24 -0700745Fall through into the next list.
Elliott Hughes966dd552016-12-08 15:56:04 -0800746.It Dq Li \&;\*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700747Evaluate the remaining pattern-list tuples.
748.El
749.Pp
750The exit status of a
751.Ic case
752statement is that of the executed
753.Ar list ;
754if no
755.Ar list
756is executed, the exit status is zero.
757.It Xo for Ar name
758.Oo in Ar word No ... Oc ;
759.No do Ar list ; No done
760.Xc
761For each
762.Ar word
763in the specified word list, the parameter
764.Ar name
765is set to the word and
766.Ar list
767is executed.
768If
769.Ic in
Elliott Hughes966dd552016-12-08 15:56:04 -0800770is not used to specify a word list, the positional parameters ($1, $2,
771etc.) are used instead.
Geremy Condra03ebf062011-10-12 18:17:24 -0700772For historical reasons, open and close braces may be used instead of
773.Ic do
774and
775.Ic done
776e.g.\&
777.Ic for i; { echo $i; } .
778The exit status of a
779.Ic for
780statement is the last exit status of
781.Ar list ;
782if
783.Ar list
784is never executed, the exit status is zero.
785.It Xo if Ar list ;
786.No then Ar list ;
787.Oo elif Ar list ;
788.No then Ar list ; Oc
789.No ...
790.Oo else Ar list ; Oc
791.No fi
792.Xc
793If the exit status of the first
794.Ar list
795is zero, the second
796.Ar list
797is executed; otherwise, the
798.Ar list
799following the
800.Ic elif ,
801if any, is executed with similar consequences.
802If all the lists following the
803.Ic if
804and
805.Ic elif Ns s
806fail (i.e. exit with non-zero status), the
807.Ar list
808following the
809.Ic else
810is executed.
811The exit status of an
812.Ic if
813statement is that of non-conditional
814.Ar list
815that is executed; if no non-conditional
816.Ar list
817is executed, the exit status is zero.
818.It Xo select Ar name
819.Oo in Ar word No ... Oc ;
820.No do Ar list ; No done
821.Xc
822The
823.Ic select
824statement provides an automatic method of presenting the user with a menu and
825selecting from it.
826An enumerated list of the specified
827.Ar word Ns (s)
828is printed on standard error, followed by a prompt
829.Po
Elliott Hughes966dd552016-12-08 15:56:04 -0800830.Ev PS3 :
831normally
832.Dq Li #?\ \&
Geremy Condra03ebf062011-10-12 18:17:24 -0700833.Pc .
834A number corresponding to one of the enumerated words is then read from
835standard input,
836.Ar name
837is set to the selected word (or unset if the selection is not valid),
838.Ev REPLY
839is set to what was read (leading/trailing space is stripped), and
840.Ar list
841is executed.
842If a blank line (i.e. zero or more
843.Ev IFS
844octets) is entered, the menu is reprinted without executing
845.Ar list .
846.Pp
847When
848.Ar list
849completes, the enumerated list is printed if
850.Ev REPLY
Elliott Hughes966dd552016-12-08 15:56:04 -0800851is empty, the prompt is printed, and so on.
Geremy Condra03ebf062011-10-12 18:17:24 -0700852This process continues until an end-of-file
853is read, an interrupt is received, or a
854.Ic break
855statement is executed inside the loop.
856If
Elliott Hughes966dd552016-12-08 15:56:04 -0800857.Dq in Ar word ...
Geremy Condra03ebf062011-10-12 18:17:24 -0700858is omitted, the positional parameters are used
859(i.e. $1, $2, etc.).
860For historical reasons, open and close braces may be used instead of
861.Ic do
862and
863.Ic done
864e.g.\&
865.Ic select i; { echo $i; } .
866The exit status of a
867.Ic select
868statement is zero if a
869.Ic break
870statement is used to exit the loop, non-zero otherwise.
871.It Xo until Ar list ;
872.No do Ar list ;
873.No done
874.Xc
875This works like
876.Ic while ,
877except that the body is executed only while the exit status of the first
878.Ar list
879is non-zero.
880.It Xo while Ar list ;
881.No do Ar list ;
882.No done
883.Xc
884A
885.Ic while
886is a pre-checked loop.
887Its body is executed as often as the exit status of the first
888.Ar list
889is zero.
890The exit status of a
891.Ic while
892statement is the last exit status of the
893.Ar list
894in the body of the loop; if the body is not executed, the exit status is zero.
895.It Xo function Ar name
896.No { Ar list ; No }
897.Xc
898Defines the function
899.Ar name
900(see
901.Sx Functions
902below).
903Note that redirections specified after a function definition are
904performed whenever the function is executed, not when the function definition
905is executed.
906.It Ar name Ns \&() Ar command
907Mostly the same as
908.Ic function
909(see
910.Sx Functions
911below).
912Whitespace (space or tab) after
913.Ar name
914will be ignored most of the time.
915.It Xo function Ar name Ns \&()
916.No { Ar list ; No }
917.Xc
918The same as
919.Ar name Ns \&()
920.Pq Nm bash Ns ism .
921The
922.Ic function
923keyword is ignored.
924.It Xo Ic time Op Fl p
925.Op Ar pipeline
926.Xc
927The
928.Sx Command execution
929section describes the
930.Ic time
931reserved word.
932.It \&(( Ar expression No ))
933The arithmetic expression
934.Ar expression
935is evaluated; equivalent to
Elliott Hughes966dd552016-12-08 15:56:04 -0800936.Dq Li let \&" Ns Ar expression Ns \&"
Geremy Condra03ebf062011-10-12 18:17:24 -0700937(see
938.Sx Arithmetic expressions
939and the
940.Ic let
Elliott Hughesfc0307d2016-02-02 15:26:47 -0800941command, below) in a compound construct.
Geremy Condra03ebf062011-10-12 18:17:24 -0700942.It Bq Bq Ar \ \&expression\ \&
943Similar to the
944.Ic test
945and
946.Ic \&[ ... \&]
947commands (described later), with the following exceptions:
948.Bl -bullet
949.It
950Field splitting and file name generation are not performed on arguments.
951.It
952The
953.Fl a
954.Pq AND
955and
956.Fl o
957.Pq OR
958operators are replaced with
Elliott Hughes966dd552016-12-08 15:56:04 -0800959.Dq Li &&
Geremy Condra03ebf062011-10-12 18:17:24 -0700960and
Elliott Hughes966dd552016-12-08 15:56:04 -0800961.Dq Li \*(Ba\*(Ba ,
Geremy Condra03ebf062011-10-12 18:17:24 -0700962respectively.
963.It
964Operators (e.g.\&
Elliott Hughes966dd552016-12-08 15:56:04 -0800965.Dq Li \-f ,
966.Dq Li = ,
967.Dq Li \&! )
Geremy Condra03ebf062011-10-12 18:17:24 -0700968must be unquoted.
969.It
Elliott Hughes966dd552016-12-08 15:56:04 -0800970Parameter, command and arithmetic substitutions are performed as expressions
Geremy Condra03ebf062011-10-12 18:17:24 -0700971are evaluated and lazy expression evaluation is used for the
Elliott Hughes966dd552016-12-08 15:56:04 -0800972.Dq Li &&
Geremy Condra03ebf062011-10-12 18:17:24 -0700973and
Elliott Hughes966dd552016-12-08 15:56:04 -0800974.Dq Li \*(Ba\*(Ba
Geremy Condra03ebf062011-10-12 18:17:24 -0700975operators.
976This means that in the following statement,
977.Ic $(\*(Ltfoo)
978is evaluated if and only if the file
979.Pa foo
980exists and is readable:
981.Bd -literal -offset indent
982$ [[ \-r foo && $(\*(Ltfoo) = b*r ]]
983.Ed
984.It
985The second operand of the
Elliott Hughes966dd552016-12-08 15:56:04 -0800986.Dq Li !=
Geremy Condra03ebf062011-10-12 18:17:24 -0700987and
Elliott Hughes966dd552016-12-08 15:56:04 -0800988.Dq Li =
Elliott Hughes737fdce2014-08-07 12:59:26 -0700989expressions are a subset of patterns (e.g. the comparison
Geremy Condra03ebf062011-10-12 18:17:24 -0700990.Ic \&[[ foobar = f*r ]]
991succeeds).
992This even works indirectly:
993.Bd -literal -offset indent
994$ bar=foobar; baz=\*(aqf*r\*(aq
995$ [[ $bar = $baz ]]; echo $?
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000996$ [[ $bar = \&"$baz" ]]; echo $?
Geremy Condra03ebf062011-10-12 18:17:24 -0700997.Ed
998.Pp
999Perhaps surprisingly, the first comparison succeeds,
1000whereas the second doesn't.
Elliott Hughes737fdce2014-08-07 12:59:26 -07001001This does not apply to all extglob metacharacters, currently.
Geremy Condra03ebf062011-10-12 18:17:24 -07001002.El
1003.El
1004.Ss Quoting
1005Quoting is used to prevent the shell from treating characters or words
1006specially.
1007There are three methods of quoting.
1008First,
1009.Ql \e
1010quotes the following character, unless it is at the end of a line, in which
1011case both the
1012.Ql \e
1013and the newline are stripped.
1014Second, a single quote
Elliott Hughes966dd552016-12-08 15:56:04 -08001015.Pq Dq Li \*(aq
Geremy Condra03ebf062011-10-12 18:17:24 -07001016quotes everything up to the next single quote (this may span lines).
1017Third, a double quote
Elliott Hughes966dd552016-12-08 15:56:04 -08001018.Pq Ql \&"
Geremy Condra03ebf062011-10-12 18:17:24 -07001019quotes all characters, except
1020.Ql $ ,
Elliott Hughes966dd552016-12-08 15:56:04 -08001021.Ql \e
Elliott Hughes77740fc2016-08-12 15:06:53 -07001022and
1023.Ql \` ,
1024up to the next unescaped double quote.
Geremy Condra03ebf062011-10-12 18:17:24 -07001025.Ql $
1026and
1027.Ql \`
Elliott Hughes966dd552016-12-08 15:56:04 -08001028inside double quotes have their usual meaning (i.e. parameter, arithmetic
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001029or command substitution) except no field splitting is carried out on the
Elliott Hughes77740fc2016-08-12 15:06:53 -07001030results of double-quoted substitutions, and the old-style form of command
1031substitution has backslash-quoting for double quotes enabled.
Geremy Condra03ebf062011-10-12 18:17:24 -07001032If a
1033.Ql \e
1034inside a double-quoted string is followed by
Geremy Condra03ebf062011-10-12 18:17:24 -07001035.Ql \&" ,
Elliott Hughes77740fc2016-08-12 15:06:53 -07001036.Ql $ ,
Elliott Hughes966dd552016-12-08 15:56:04 -08001037.Ql \e
Elliott Hughes77740fc2016-08-12 15:06:53 -07001038or
1039.Ql \` ,
1040only the
1041.Ql \e
1042is removed, i.e. the combination is replaced by the second character;
1043if it is followed by a newline, both the
Geremy Condra03ebf062011-10-12 18:17:24 -07001044.Ql \e
1045and the newline are stripped; otherwise, both the
1046.Ql \e
1047and the character following are unchanged.
1048.Pp
1049If a single-quoted string is preceded by an unquoted
1050.Ql $ ,
1051C style backslash expansion (see below) is applied (even single quote
1052characters inside can be escaped and do not terminate the string then);
1053the expanded result is treated as any other single-quoted string.
1054If a double-quoted string is preceded by an unquoted
1055.Ql $ ,
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001056the
1057.Ql $
1058is simply ignored.
Geremy Condra03ebf062011-10-12 18:17:24 -07001059.Ss Backslash expansion
1060In places where backslashes are expanded, certain C and
1061.At
1062.Nm ksh
1063or GNU
1064.Nm bash
1065style escapes are translated.
1066These include
Elliott Hughes966dd552016-12-08 15:56:04 -08001067.Dq Li \ea ,
1068.Dq Li \eb ,
1069.Dq Li \ef ,
1070.Dq Li \en ,
1071.Dq Li \er ,
1072.Dq Li \et ,
1073.Dq Li \eU######## ,
1074.Dq Li \eu####
Geremy Condra03ebf062011-10-12 18:17:24 -07001075and
Elliott Hughes966dd552016-12-08 15:56:04 -08001076.Dq Li \ev .
Geremy Condra03ebf062011-10-12 18:17:24 -07001077For
Elliott Hughes966dd552016-12-08 15:56:04 -08001078.Dq Li \eU########
Geremy Condra03ebf062011-10-12 18:17:24 -07001079and
Elliott Hughes966dd552016-12-08 15:56:04 -08001080.Dq Li \eu#### ,
Geremy Condra03ebf062011-10-12 18:17:24 -07001081.Dq #
Elliott Hughes966dd552016-12-08 15:56:04 -08001082means a hexadecimal digit, of which there may be none up to four or eight;
Elliott Hughes47086262019-03-26 12:34:31 -07001083these escapes translate a Universal Coded Character Set codepoint to UTF-8.
Geremy Condra03ebf062011-10-12 18:17:24 -07001084Furthermore,
Elliott Hughes966dd552016-12-08 15:56:04 -08001085.Dq Li \eE
Geremy Condra03ebf062011-10-12 18:17:24 -07001086and
Elliott Hughes966dd552016-12-08 15:56:04 -08001087.Dq Li \ee
Geremy Condra03ebf062011-10-12 18:17:24 -07001088expand to the escape character.
1089.Pp
1090In the
1091.Ic print
1092builtin mode,
Elliott Hughes966dd552016-12-08 15:56:04 -08001093.Dq Li \e" ,
1094.Dq Li \e\*(aq
Geremy Condra03ebf062011-10-12 18:17:24 -07001095and
Elliott Hughes966dd552016-12-08 15:56:04 -08001096.Dq Li \e?
Geremy Condra03ebf062011-10-12 18:17:24 -07001097are explicitly excluded;
1098octal sequences must have the none up to three octal digits
1099.Dq #
1100prefixed with the digit zero
Elliott Hughes966dd552016-12-08 15:56:04 -08001101.Pq Dq Li \e0### ;
Geremy Condra03ebf062011-10-12 18:17:24 -07001102hexadecimal sequences
Elliott Hughes966dd552016-12-08 15:56:04 -08001103.Dq Li \ex##
Geremy Condra03ebf062011-10-12 18:17:24 -07001104are limited to none up to two hexadecimal digits
1105.Dq # ;
1106both octal and hexadecimal sequences convert to raw octets;
Elliott Hughes966dd552016-12-08 15:56:04 -08001107.Dq Li \e# ,
Geremy Condra03ebf062011-10-12 18:17:24 -07001108where # is none of the above, translates to \e# (backslashes are retained).
1109.Pp
1110Backslash expansion in the C style mode slightly differs: octal sequences
Elliott Hughes966dd552016-12-08 15:56:04 -08001111.Dq Li \e###
Geremy Condra03ebf062011-10-12 18:17:24 -07001112must have no digit zero prefixing the one up to three octal digits
1113.Dq #
1114and yield raw octets; hexadecimal sequences
Elliott Hughes966dd552016-12-08 15:56:04 -08001115.Dq Li \ex#*
Geremy Condra03ebf062011-10-12 18:17:24 -07001116greedily eat up as many hexadecimal digits
1117.Dq #
1118as they can and terminate with the first non-hexadecimal digit;
Elliott Hughes47086262019-03-26 12:34:31 -07001119these translate a Universal Coded Character Set codepoint to UTF-8.
Geremy Condra03ebf062011-10-12 18:17:24 -07001120The sequence
Elliott Hughes966dd552016-12-08 15:56:04 -08001121.Dq Li \ec# ,
Geremy Condra03ebf062011-10-12 18:17:24 -07001122where
1123.Dq #
1124is any octet, translates to Ctrl-# (which basically means,
Elliott Hughes966dd552016-12-08 15:56:04 -08001125.Dq Li \ec?
Geremy Condra03ebf062011-10-12 18:17:24 -07001126becomes DEL, everything else is bitwise ANDed with 0x1F).
1127Finally,
Elliott Hughes966dd552016-12-08 15:56:04 -08001128.Dq Li \e# ,
Geremy Condra03ebf062011-10-12 18:17:24 -07001129where # is none of the above, translates to # (has the backslash trimmed),
1130even if it is a newline.
1131.Ss Aliases
1132There are two types of aliases: normal command aliases and tracked aliases.
1133Command aliases are normally used as a short hand for a long or often used
1134command.
1135The shell expands command aliases (i.e. substitutes the alias name
1136for its value) when it reads the first word of a command.
1137An expanded alias is re-processed to check for more aliases.
1138If a command alias ends in a
1139space or tab, the following word is also checked for alias expansion.
1140The alias expansion process stops when a word that is not an alias is found,
1141when a quoted word is found, or when an alias word that is currently being
1142expanded is found.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001143Aliases are specifically an interactive feature: while they do happen
1144to work in scripts and on the command line in some cases, aliases are
1145expanded during lexing, so their use must be in a separate command tree
1146from their definition; otherwise, the alias will not be found.
1147Noticeably, command lists (separated by semicolon, in command substitutions
1148also by newline) may be one same parse tree.
Geremy Condra03ebf062011-10-12 18:17:24 -07001149.Pp
1150The following command aliases are defined automatically by the shell:
1151.Bd -literal -offset indent
Elliott Hughesa3c3f962017-04-12 16:52:30 -07001152autoload=\*(aq\e\ebuiltin typeset \-fu\*(aq
1153functions=\*(aq\e\ebuiltin typeset \-f\*(aq
1154hash=\*(aq\e\ebuiltin alias \-t\*(aq
1155history=\*(aq\e\ebuiltin fc \-l\*(aq
1156integer=\*(aq\e\ebuiltin typeset \-i\*(aq
1157local=\*(aq\e\ebuiltin typeset\*(aq
1158login=\*(aq\e\ebuiltin exec login\*(aq
1159nameref=\*(aq\e\ebuiltin typeset \-n\*(aq
Geremy Condra03ebf062011-10-12 18:17:24 -07001160nohup=\*(aqnohup \*(aq
Elliott Hughesa3c3f962017-04-12 16:52:30 -07001161r=\*(aq\e\ebuiltin fc \-e \-\*(aq
1162type=\*(aq\e\ebuiltin whence \-v\*(aq
Geremy Condra03ebf062011-10-12 18:17:24 -07001163.Ed
1164.Pp
1165Tracked aliases allow the shell to remember where it found a particular
1166command.
1167The first time the shell does a path search for a command that is
1168marked as a tracked alias, it saves the full path of the command.
1169The next
1170time the command is executed, the shell checks the saved path to see that it
1171is still valid, and if so, avoids repeating the path search.
1172Tracked aliases can be listed and created using
Elliott Hughes96b43632015-07-17 11:39:41 -07001173.Ic alias Fl t .
Geremy Condra03ebf062011-10-12 18:17:24 -07001174Note that changing the
1175.Ev PATH
1176parameter clears the saved paths for all tracked aliases.
1177If the
1178.Ic trackall
1179option is set (i.e.\&
Elliott Hughes96b43632015-07-17 11:39:41 -07001180.Ic set Fl o Ic trackall
Geremy Condra03ebf062011-10-12 18:17:24 -07001181or
Elliott Hughes96b43632015-07-17 11:39:41 -07001182.Ic set Fl h ) ,
Geremy Condra03ebf062011-10-12 18:17:24 -07001183the shell tracks all commands.
1184This option is set automatically for non-interactive shells.
1185For interactive shells, only the following commands are
1186automatically tracked:
1187.Xr cat 1 ,
1188.Xr cc 1 ,
1189.Xr chmod 1 ,
1190.Xr cp 1 ,
1191.Xr date 1 ,
1192.Xr ed 1 ,
1193.Xr emacs 1 ,
1194.Xr grep 1 ,
1195.Xr ls 1 ,
1196.Xr make 1 ,
1197.Xr mv 1 ,
1198.Xr pr 1 ,
1199.Xr rm 1 ,
1200.Xr sed 1 ,
1201.Xr sh 1 ,
Elliott Hughes966dd552016-12-08 15:56:04 -08001202.Xr vi 1
Geremy Condra03ebf062011-10-12 18:17:24 -07001203and
1204.Xr who 1 .
1205.Ss Substitution
1206The first step the shell takes in executing a simple-command is to perform
1207substitutions on the words of the command.
1208There are three kinds of
Elliott Hughes966dd552016-12-08 15:56:04 -08001209substitution: parameter, command and arithmetic.
Geremy Condra03ebf062011-10-12 18:17:24 -07001210Parameter substitutions,
1211which are described in detail in the next section, take the form
1212.Pf $ Ns Ar name
1213or
1214.Pf ${ Ns Ar ... Ns } ;
1215command substitutions take the form
1216.Pf $( Ns Ar command Ns \&)
1217or (deprecated)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001218.Pf \` Ns Ar command Ns \`
1219or (executed in the current environment)
1220.Pf ${\ \& Ar command Ns \&;}
1221and strip trailing newlines;
Geremy Condra03ebf062011-10-12 18:17:24 -07001222and arithmetic substitutions take the form
1223.Pf $(( Ns Ar expression Ns )) .
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001224Parsing the current-environment command substitution requires a space,
1225tab or newline after the opening brace and that the closing brace be
1226recognised as a keyword (i.e. is preceded by a newline or semicolon).
1227They are also called funsubs (function substitutions) and behave like
1228functions in that
1229.Ic local
1230and
1231.Ic return
1232work, and in that
1233.Ic exit
Elliott Hughesb27ce952015-04-21 13:39:18 -07001234terminates the parent shell; shell options are shared.
Geremy Condra03ebf062011-10-12 18:17:24 -07001235.Pp
Thorsten Glaser811a5752013-07-25 14:24:45 +00001236Another variant of substitution are the valsubs (value substitutions)
1237.Pf ${\*(Ba\& Ns Ar command Ns \&;}
1238which are also executed in the current environment, like funsubs, but
1239share their I/O with the parent; instead, they evaluate to whatever
1240the, initially empty, expression-local variable
1241.Ev REPLY
1242is set to within the
Elliott Hughes96b43632015-07-17 11:39:41 -07001243.Ar command Ns s .
Thorsten Glaser811a5752013-07-25 14:24:45 +00001244.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07001245If a substitution appears outside of double quotes, the results of the
1246substitution are generally subject to word or field splitting according to
1247the current value of the
1248.Ev IFS
1249parameter.
1250The
1251.Ev IFS
1252parameter specifies a list of octets which are used to break a string up
Elliott Hughes966dd552016-12-08 15:56:04 -08001253into several words; any octets from the set space, tab and newline that
Geremy Condra03ebf062011-10-12 18:17:24 -07001254appear in the
1255.Ev IFS
1256octets are called
1257.Dq IFS whitespace .
1258Sequences of one or more
1259.Ev IFS
1260whitespace octets, in combination with zero or one
1261.Pf non- Ev IFS
1262whitespace octets, delimit a field.
1263As a special case, leading and trailing
1264.Ev IFS
Elliott Hughes56b517d2014-10-06 11:30:44 -07001265whitespace is stripped (i.e. no leading or trailing empty field
1266is created by it); leading or trailing
Geremy Condra03ebf062011-10-12 18:17:24 -07001267.Pf non- Ev IFS
1268whitespace does create an empty field.
1269.Pp
1270Example: If
1271.Ev IFS
1272is set to
Elliott Hughes966dd552016-12-08 15:56:04 -08001273.Dq Li \*(Ltspace\*(Gt:
Geremy Condra03ebf062011-10-12 18:17:24 -07001274and VAR is set to
Elliott Hughes966dd552016-12-08 15:56:04 -08001275.Dq Li \*(Ltspace\*(GtA\*(Ltspace\*(Gt:\*(Ltspace\*(Gt\*(Ltspace\*(GtB::D ,
Geremy Condra03ebf062011-10-12 18:17:24 -07001276the substitution for $VAR results in four fields:
Elliott Hughes966dd552016-12-08 15:56:04 -08001277.Dq Li A ,
1278.Dq Li B ,
1279.Dq
1280(an empty field) and
1281.Dq Li D .
Geremy Condra03ebf062011-10-12 18:17:24 -07001282Note that if the
1283.Ev IFS
Elliott Hughesb27ce952015-04-21 13:39:18 -07001284parameter is set to the empty string, no field splitting is done;
Elliott Hughes966dd552016-12-08 15:56:04 -08001285if it is unset, the default value of space, tab and newline is used.
Geremy Condra03ebf062011-10-12 18:17:24 -07001286.Pp
1287Also, note that the field splitting applies only to the immediate result of
1288the substitution.
1289Using the previous example, the substitution for $VAR:E
1290results in the fields:
Elliott Hughes966dd552016-12-08 15:56:04 -08001291.Dq Li A ,
1292.Dq Li B ,
1293.Dq
Geremy Condra03ebf062011-10-12 18:17:24 -07001294and
Elliott Hughes966dd552016-12-08 15:56:04 -08001295.Dq Li D:E ,
Geremy Condra03ebf062011-10-12 18:17:24 -07001296not
Elliott Hughes966dd552016-12-08 15:56:04 -08001297.Dq Li A ,
1298.Dq Li B ,
1299.Dq ,
1300.Dq Li D
Geremy Condra03ebf062011-10-12 18:17:24 -07001301and
Elliott Hughes966dd552016-12-08 15:56:04 -08001302.Dq Li E .
Geremy Condra03ebf062011-10-12 18:17:24 -07001303This behavior is POSIX compliant, but incompatible with some other shell
1304implementations which do field splitting on the word which contained the
1305substitution or use
1306.Dv IFS
1307as a general whitespace delimiter.
1308.Pp
1309The results of substitution are, unless otherwise specified, also subject to
1310brace expansion and file name expansion (see the relevant sections below).
1311.Pp
1312A command substitution is replaced by the output generated by the specified
1313command which is run in a subshell.
1314For
1315.Pf $( Ns Ar command Ns \&)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001316and
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001317.Pf ${\*(Ba\& Ns Ar command Ns \&;}
1318and
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001319.Pf ${\ \& Ar command Ns \&;}
Geremy Condra03ebf062011-10-12 18:17:24 -07001320substitutions, normal quoting rules are used when
1321.Ar command
1322is parsed; however, for the deprecated
1323.Pf \` Ns Ar command Ns \`
1324form, a
1325.Ql \e
1326followed by any of
1327.Ql $ ,
Elliott Hughes966dd552016-12-08 15:56:04 -08001328.Ql \`
Geremy Condra03ebf062011-10-12 18:17:24 -07001329or
1330.Ql \e
Elliott Hughes77740fc2016-08-12 15:06:53 -07001331is stripped (as is
1332.Ql \&"
1333when the substitution is part of a double-quoted string); a backslash
Geremy Condra03ebf062011-10-12 18:17:24 -07001334.Ql \e
Elliott Hughes77740fc2016-08-12 15:06:53 -07001335followed by any other character is unchanged.
Geremy Condra03ebf062011-10-12 18:17:24 -07001336As a special case in command substitutions, a command of the form
1337.Pf \*(Lt Ar file
1338is interpreted to mean substitute the contents of
1339.Ar file .
1340Note that
1341.Ic $(\*(Ltfoo)
1342has the same effect as
1343.Ic $(cat foo) .
1344.Pp
1345Note that some shells do not use a recursive parser for command substitutions,
1346leading to failure for certain constructs; to be portable, use as workaround
Elliott Hughes966dd552016-12-08 15:56:04 -08001347.Dq Li x=$(cat) \*(Lt\*(Lt\eEOF
Geremy Condra03ebf062011-10-12 18:17:24 -07001348(or the newline-keeping
Elliott Hughes966dd552016-12-08 15:56:04 -08001349.Dq Li x=\*(Lt\*(Lt\eEOF
Geremy Condra03ebf062011-10-12 18:17:24 -07001350extension) instead to merely slurp the string.
1351.St -p1003.1
Elliott Hughes966dd552016-12-08 15:56:04 -08001352recommends using case statements of the form
1353.Li "x=$(case $foo in (bar) echo $bar ;; (*) echo $baz ;; esac)"
Geremy Condra03ebf062011-10-12 18:17:24 -07001354instead, which would work but not serve as example for this portability issue.
1355.Bd -literal -offset indent
1356x=$(case $foo in bar) echo $bar ;; *) echo $baz ;; esac)
1357# above fails to parse on old shells; below is the workaround
Elliott Hughes966dd552016-12-08 15:56:04 -08001358x=$(eval $(cat)) \*(Lt\*(Lt\eEOF
Geremy Condra03ebf062011-10-12 18:17:24 -07001359case $foo in bar) echo $bar ;; *) echo $baz ;; esac
1360EOF
1361.Ed
1362.Pp
1363Arithmetic substitutions are replaced by the value of the specified expression.
1364For example, the command
1365.Ic print $((2+3*4))
1366displays 14.
1367See
1368.Sx Arithmetic expressions
1369for a description of an expression.
1370.Ss Parameters
1371Parameters are shell variables; they can be assigned values and their values
1372can be accessed using a parameter substitution.
1373A parameter name is either one
1374of the special single punctuation or digit character parameters described
1375below, or a letter followed by zero or more letters or digits
1376.Po
1377.Ql _
1378counts as a letter
1379.Pc .
1380The latter form can be treated as arrays by appending an array index of the
1381form
1382.Op Ar expr
1383where
1384.Ar expr
1385is an arithmetic expression.
1386Array indices in
1387.Nm
1388are limited to the range 0 through 4294967295, inclusive.
1389That is, they are a 32-bit unsigned integer.
1390.Pp
1391Parameter substitutions take the form
1392.Pf $ Ns Ar name ,
Elliott Hughes966dd552016-12-08 15:56:04 -08001393.Pf ${ Ns Ar name Ns }
Geremy Condra03ebf062011-10-12 18:17:24 -07001394or
1395.Sm off
1396.Pf ${ Ar name Oo Ar expr Oc }
1397.Sm on
1398where
1399.Ar name
1400is a parameter name.
Elliott Hughes47086262019-03-26 12:34:31 -07001401Substitutions of an an array in scalar context, i.e. without an
1402.Ar expr
1403in the latter form mentioned above, expand the element with the key
1404.Dq 0 .
Geremy Condra03ebf062011-10-12 18:17:24 -07001405Substitution of all array elements with
1406.Pf ${ Ns Ar name Ns \&[*]}
1407and
1408.Pf ${ Ns Ar name Ns \&[@]}
1409works equivalent to $* and $@ for positional parameters.
1410If substitution is performed on a parameter
1411(or an array parameter element)
Elliott Hughes966dd552016-12-08 15:56:04 -08001412that is not set, an empty string is substituted unless the
Geremy Condra03ebf062011-10-12 18:17:24 -07001413.Ic nounset
1414option
Elliott Hughes966dd552016-12-08 15:56:04 -08001415.Pq Ic set Fl u
Geremy Condra03ebf062011-10-12 18:17:24 -07001416is set, in which case an error occurs.
1417.Pp
1418Parameters can be assigned values in a number of ways.
1419First, the shell implicitly sets some parameters like
Elliott Hughes966dd552016-12-08 15:56:04 -08001420.Dq Li # ,
1421.Dq Li PWD
Geremy Condra03ebf062011-10-12 18:17:24 -07001422and
Elliott Hughes966dd552016-12-08 15:56:04 -08001423.Dq Li $ ;
Geremy Condra03ebf062011-10-12 18:17:24 -07001424this is the only way the special single character parameters are set.
1425Second, parameters are imported from the shell's environment at startup.
1426Third, parameters can be assigned values on the command line: for example,
1427.Ic FOO=bar
1428sets the parameter
Elliott Hughes966dd552016-12-08 15:56:04 -08001429.Dq Li FOO
Geremy Condra03ebf062011-10-12 18:17:24 -07001430to
Elliott Hughes966dd552016-12-08 15:56:04 -08001431.Dq Li bar ;
Geremy Condra03ebf062011-10-12 18:17:24 -07001432multiple parameter assignments can be given on a single command line and they
1433can be followed by a simple-command, in which case the assignments are in
1434effect only for the duration of the command (such assignments are also
1435exported; see below for the implications of this).
1436Note that both the parameter name and the
1437.Ql =
1438must be unquoted for the shell to recognise a parameter assignment.
1439The construct
1440.Ic FOO+=baz
1441is also recognised; the old and new values are immediately concatenated.
1442The fourth way of setting a parameter is with the
1443.Ic export ,
1444.Ic global ,
Elliott Hughes966dd552016-12-08 15:56:04 -08001445.Ic readonly
Geremy Condra03ebf062011-10-12 18:17:24 -07001446and
1447.Ic typeset
1448commands; see their descriptions in the
1449.Sx Command execution
1450section.
1451Fifth,
1452.Ic for
1453and
1454.Ic select
1455loops set parameters as well as the
1456.Ic getopts ,
Elliott Hughes966dd552016-12-08 15:56:04 -08001457.Ic read
Geremy Condra03ebf062011-10-12 18:17:24 -07001458and
Elliott Hughes96b43632015-07-17 11:39:41 -07001459.Ic set Fl A
Geremy Condra03ebf062011-10-12 18:17:24 -07001460commands.
1461Lastly, parameters can be assigned values using assignment operators
1462inside arithmetic expressions (see
1463.Sx Arithmetic expressions
1464below) or using the
1465.Sm off
1466.Pf ${ Ar name No = Ar value No }
1467.Sm on
1468form of the parameter substitution (see below).
1469.Pp
1470Parameters with the export attribute (set using the
1471.Ic export
1472or
1473.Ic typeset Fl x
1474commands, or by parameter assignments followed by simple commands) are put in
1475the environment (see
1476.Xr environ 7 )
1477of commands run by the shell as
1478.Ar name Ns = Ns Ar value
1479pairs.
1480The order in which parameters appear in the environment of a command is
1481unspecified.
1482When the shell starts up, it extracts parameters and their values
1483from its environment and automatically sets the export attribute for those
1484parameters.
1485.Pp
1486Modifiers can be applied to the
1487.Pf ${ Ns Ar name Ns }
1488form of parameter substitution:
1489.Bl -tag -width Ds
1490.Sm off
1491.It ${ Ar name No :\- Ar word No }
1492.Sm on
1493If
1494.Ar name
Elliott Hughes966dd552016-12-08 15:56:04 -08001495is set and not empty,
Geremy Condra03ebf062011-10-12 18:17:24 -07001496it is substituted; otherwise,
1497.Ar word
1498is substituted.
1499.Sm off
1500.It ${ Ar name No :+ Ar word No }
1501.Sm on
1502If
1503.Ar name
Elliott Hughes966dd552016-12-08 15:56:04 -08001504is set and not empty,
Geremy Condra03ebf062011-10-12 18:17:24 -07001505.Ar word
1506is substituted; otherwise, nothing is substituted.
1507.Sm off
1508.It ${ Ar name No := Ar word No }
1509.Sm on
1510If
1511.Ar name
Elliott Hughes966dd552016-12-08 15:56:04 -08001512is set and not empty,
Geremy Condra03ebf062011-10-12 18:17:24 -07001513it is substituted; otherwise, it is assigned
1514.Ar word
1515and the resulting value of
1516.Ar name
1517is substituted.
1518.Sm off
1519.It ${ Ar name No :? Ar word No }
1520.Sm on
1521If
1522.Ar name
Elliott Hughes966dd552016-12-08 15:56:04 -08001523is set and not empty,
Geremy Condra03ebf062011-10-12 18:17:24 -07001524it is substituted; otherwise,
1525.Ar word
1526is printed on standard error (preceded by
1527.Ar name : )
1528and an error occurs (normally causing termination of a shell script, function,
Elliott Hughes966dd552016-12-08 15:56:04 -08001529or a script sourced using the
1530.Dq Li \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07001531built-in).
1532If
1533.Ar word
1534is omitted, the string
Elliott Hughes966dd552016-12-08 15:56:04 -08001535.Dq Li parameter null or not set
Geremy Condra03ebf062011-10-12 18:17:24 -07001536is used instead.
Geremy Condra03ebf062011-10-12 18:17:24 -07001537.El
1538.Pp
1539Note that, for all of the above,
1540.Ar word
1541is actually considered quoted, and special parsing rules apply.
1542The parsing rules also differ on whether the expression is double-quoted:
1543.Ar word
1544then uses double-quoting rules, except for the double quote itself
Elliott Hughes966dd552016-12-08 15:56:04 -08001545.Pq Ql \&"
Geremy Condra03ebf062011-10-12 18:17:24 -07001546and the closing brace, which, if backslash escaped, gets quote removal applied.
1547.Pp
1548In the above modifiers, the
1549.Ql \&:
1550can be omitted, in which case the conditions only depend on
1551.Ar name
Elliott Hughes966dd552016-12-08 15:56:04 -08001552being set (as opposed to set and not empty).
Geremy Condra03ebf062011-10-12 18:17:24 -07001553If
1554.Ar word
Elliott Hughes966dd552016-12-08 15:56:04 -08001555is needed, parameter, command, arithmetic and tilde substitution are performed
Geremy Condra03ebf062011-10-12 18:17:24 -07001556on it; if
1557.Ar word
1558is not needed, it is not evaluated.
1559.Pp
Elliott Hughes47086262019-03-26 12:34:31 -07001560The following forms of parameter substitution can also be used:
Geremy Condra03ebf062011-10-12 18:17:24 -07001561.Pp
1562.Bl -tag -width Ds -compact
1563.It Pf ${# Ns Ar name Ns \&}
1564The number of positional parameters if
1565.Ar name
1566is
Elliott Hughes966dd552016-12-08 15:56:04 -08001567.Dq Li * ,
1568.Dq Li @
Geremy Condra03ebf062011-10-12 18:17:24 -07001569or not specified; otherwise the length
1570.Pq in characters
1571of the string value of parameter
1572.Ar name .
1573.Pp
1574.It Pf ${# Ns Ar name Ns \&[*]}
1575.It Pf ${# Ns Ar name Ns \&[@]}
1576The number of elements in the array
1577.Ar name .
1578.Pp
1579.It Pf ${% Ns Ar name Ns \&}
1580The width
1581.Pq in screen columns
1582of the string value of parameter
1583.Ar name ,
1584or \-1 if
1585.Pf ${ Ns Ar name Ns }
1586contains a control character.
1587.Pp
1588.It Pf ${! Ns Ar name Ns }
1589The name of the variable referred to by
1590.Ar name .
1591This will be
1592.Ar name
1593except when
1594.Ar name
1595is a name reference (bound variable), created by the
1596.Ic nameref
1597command (which is an alias for
1598.Ic typeset Fl n ) .
Elliott Hughes77740fc2016-08-12 15:06:53 -07001599.Ar name
1600cannot be one of most special parameters (see below).
Geremy Condra03ebf062011-10-12 18:17:24 -07001601.Pp
1602.It Pf ${! Ns Ar name Ns \&[*]}
1603.It Pf ${! Ns Ar name Ns \&[@]}
1604The names of indices (keys) in the array
1605.Ar name .
1606.Pp
1607.Sm off
1608.It Xo
1609.Pf ${ Ar name
1610.Pf # Ar pattern No }
1611.Xc
1612.It Xo
1613.Pf ${ Ar name
1614.Pf ## Ar pattern No }
1615.Xc
1616.Sm on
1617If
1618.Ar pattern
1619matches the beginning of the value of parameter
1620.Ar name ,
1621the matched text is deleted from the result of substitution.
1622A single
1623.Ql #
1624results in the shortest match, and two
1625of them result in the longest match.
1626Cannot be applied to a vector
1627.Pq ${*} or ${@} or ${array[*]} or ${array[@]} .
1628.Pp
1629.Sm off
1630.It Xo
1631.Pf ${ Ar name
1632.Pf % Ar pattern No }
1633.Xc
1634.It Xo
1635.Pf ${ Ar name
1636.Pf %% Ar pattern No }
1637.Xc
1638.Sm on
Elliott Hughes966dd552016-12-08 15:56:04 -08001639Like ${...#...} substitution, but it deletes from the end of the value.
Geremy Condra03ebf062011-10-12 18:17:24 -07001640Cannot be applied to a vector.
1641.Pp
1642.Sm off
1643.It Xo
1644.Pf ${ Ar name
1645.Pf / Ar pattern / Ar string No }
1646.Xc
1647.It Xo
1648.Pf ${ Ar name
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001649.Pf /# Ar pattern / Ar string No }
1650.Xc
1651.It Xo
1652.Pf ${ Ar name
1653.Pf /% Ar pattern / Ar string No }
1654.Xc
1655.It Xo
1656.Pf ${ Ar name
Geremy Condra03ebf062011-10-12 18:17:24 -07001657.Pf // Ar pattern / Ar string No }
1658.Xc
1659.Sm on
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001660The longest match of
Geremy Condra03ebf062011-10-12 18:17:24 -07001661.Ar pattern
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001662in the value of parameter
1663.Ar name
1664is replaced with
1665.Ar string
1666(deleted if
1667.Ar string
1668is empty; the trailing slash
1669.Pq Ql /
1670may be omitted in that case).
1671A leading slash followed by
1672.Ql #
1673or
1674.Ql %
1675causes the pattern to be anchored at the beginning or end of
1676the value, respectively; empty unanchored
1677.Ar pattern Ns s
1678cause no replacement; a single leading slash or use of a
Geremy Condra03ebf062011-10-12 18:17:24 -07001679.Ar pattern
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001680that matches the empty string causes the replacement to
1681happen only once; two leading slashes cause all occurrences
1682of matches in the value to be replaced.
Geremy Condra03ebf062011-10-12 18:17:24 -07001683Cannot be applied to a vector.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001684Inefficiently implemented, may be slow.
Geremy Condra03ebf062011-10-12 18:17:24 -07001685.Pp
1686.Sm off
1687.It Xo
Elliott Hughes77740fc2016-08-12 15:06:53 -07001688.Pf ${ Ar name
1689.Pf @/ Ar pattern / Ar string No }
1690.Xc
1691.Sm on
1692The same as
1693.Sm off
1694.Xo
1695.Pf ${ Ar name
1696.Pf // Ar pattern / Ar string No } ,
1697.Xc
1698.Sm on
1699except that both
1700.Ar pattern
1701and
1702.Ar string
1703are expanded anew for each iteration.
1704.Pp
1705.Sm off
1706.It Xo
Geremy Condra03ebf062011-10-12 18:17:24 -07001707.Pf ${ Ar name : Ns Ar pos
1708.Pf : Ns Ar len Ns }
1709.Xc
1710.Sm on
1711The first
1712.Ar len
1713characters of
1714.Ar name ,
1715starting at position
1716.Ar pos ,
1717are substituted.
1718Both
1719.Ar pos
1720and
1721.Pf : Ns Ar len
1722are optional.
1723If
1724.Ar pos
1725is negative, counting starts at the end of the string; if it
1726is omitted, it defaults to 0.
1727If
1728.Ar len
1729is omitted or greater than the length of the remaining string,
1730all of it is substituted.
1731Both
1732.Ar pos
1733and
1734.Ar len
1735are evaluated as arithmetic expressions.
1736Currently,
1737.Ar pos
1738must start with a space, opening parenthesis or digit to be recognised.
1739Cannot be applied to a vector.
1740.Pp
Elliott Hughes737fdce2014-08-07 12:59:26 -07001741.It Pf ${ Ns Ar name Ns @#}
1742The hash (using the BAFH algorithm) of the expansion of
1743.Ar name .
1744This is also used internally for the shell's hashtables.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001745.Pp
1746.It Pf ${ Ns Ar name Ns @Q}
1747A quoted expression safe for re-entry, whose value is the value of the
1748.Ar name
1749parameter, is substituted.
Geremy Condra03ebf062011-10-12 18:17:24 -07001750.El
1751.Pp
1752Note that
1753.Ar pattern
1754may need extended globbing pattern
1755.Pq @(...) ,
1756single
1757.Pq \&\*(aq...\&\*(aq
1758or double
1759.Pq \&"...\&"
1760quote escaping unless
1761.Fl o Ic sh
1762is set.
1763.Pp
1764The following special parameters are implicitly set by the shell and cannot be
1765set directly using assignments:
1766.Bl -tag -width "1 .. 9"
1767.It Ev \&!
1768Process ID of the last background process started.
1769If no background processes have been started, the parameter is not set.
1770.It Ev \&#
1771The number of positional parameters ($1, $2, etc.).
1772.It Ev \&$
Elliott Hughes966dd552016-12-08 15:56:04 -08001773The PID of the shell or, if it is a subshell, the PID of the original shell.
Geremy Condra03ebf062011-10-12 18:17:24 -07001774Do
1775.Em NOT
1776use this mechanism for generating temporary file names; see
1777.Xr mktemp 1
1778instead.
1779.It Ev \-
1780The concatenation of the current single letter options (see the
1781.Ic set
1782command below for a list of options).
1783.It Ev \&?
1784The exit status of the last non-asynchronous command executed.
1785If the last command was killed by a signal,
Elliott Hughes966dd552016-12-08 15:56:04 -08001786.Ic \&$?
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001787is set to 128 plus the signal number, but at most 255.
Geremy Condra03ebf062011-10-12 18:17:24 -07001788.It Ev 0
1789The name of the shell, determined as follows:
1790the first argument to
1791.Nm
1792if it was invoked with the
1793.Fl c
1794option and arguments were given; otherwise the
1795.Ar file
1796argument, if it was supplied;
1797or else the basename the shell was invoked with (i.e.\&
1798.Li argv[0] ) .
1799.Ev $0
1800is also set to the name of the current script or
1801the name of the current function, if it was defined with the
1802.Ic function
1803keyword (i.e. a Korn shell style function).
1804.It Ev 1 No .. Ev 9
1805The first nine positional parameters that were supplied to the shell, function,
1806or script sourced using the
Elliott Hughes966dd552016-12-08 15:56:04 -08001807.Dq Li \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07001808built-in.
1809Further positional parameters may be accessed using
1810.Pf ${ Ar number Ns } .
1811.It Ev *
1812All positional parameters (except 0), i.e. $1, $2, $3, ...
1813.br
1814If used
1815outside of double quotes, parameters are separate words (which are subjected
1816to word splitting); if used within double quotes, parameters are separated
1817by the first character of the
1818.Ev IFS
1819parameter (or the empty string if
1820.Ev IFS
Elliott Hughes966dd552016-12-08 15:56:04 -08001821is unset.
Geremy Condra03ebf062011-10-12 18:17:24 -07001822.It Ev @
1823Same as
1824.Ic $* ,
1825unless it is used inside double quotes, in which case a separate word is
1826generated for each positional parameter.
1827If there are no positional parameters, no word is generated.
Elliott Hughes966dd552016-12-08 15:56:04 -08001828.Ic \&"$@"
Geremy Condra03ebf062011-10-12 18:17:24 -07001829can be used to access arguments, verbatim, without losing
Elliott Hughes966dd552016-12-08 15:56:04 -08001830empty arguments or splitting arguments with spaces (IFS, actually).
Geremy Condra03ebf062011-10-12 18:17:24 -07001831.El
1832.Pp
1833The following parameters are set and/or used by the shell:
1834.Bl -tag -width "KSH_VERSION"
1835.It Ev _
1836.Pq underscore
1837When an external command is executed by the shell, this parameter is set in the
1838environment of the new process to the path of the executed command.
1839In interactive use, this parameter is also set in the parent shell to the last
1840word of the previous command.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001841.It Ev BASHPID
1842The PID of the shell or subshell.
Geremy Condra03ebf062011-10-12 18:17:24 -07001843.It Ev CDPATH
Elliott Hughesb27ce952015-04-21 13:39:18 -07001844Like
1845.Ev PATH ,
1846but used to resolve the argument to the
Geremy Condra03ebf062011-10-12 18:17:24 -07001847.Ic cd
1848built-in command.
Geremy Condra03ebf062011-10-12 18:17:24 -07001849Note that if
1850.Ev CDPATH
1851is set and does not contain
Elliott Hughes966dd552016-12-08 15:56:04 -08001852.Dq Li \&.
Elliott Hughesb27ce952015-04-21 13:39:18 -07001853or an empty string element, the current directory is not searched.
Geremy Condra03ebf062011-10-12 18:17:24 -07001854Also, the
1855.Ic cd
1856built-in command will display the resulting directory when a match is found
1857in any search path other than the empty path.
1858.It Ev COLUMNS
1859Set to the number of columns on the terminal or window.
Elliott Hughes47086262019-03-26 12:34:31 -07001860If never unset and not imported, always set dynamically;
1861unless the value as reported by
Geremy Condra03ebf062011-10-12 18:17:24 -07001862.Xr stty 1
Elliott Hughes47086262019-03-26 12:34:31 -07001863is non-zero and sane enough (minimum is 12x3), defaults to 80; similar for
Geremy Condra03ebf062011-10-12 18:17:24 -07001864.Ev LINES .
Elliott Hughes966dd552016-12-08 15:56:04 -08001865This parameter is used by the interactive line editing modes and by the
Geremy Condra03ebf062011-10-12 18:17:24 -07001866.Ic select ,
Elliott Hughes966dd552016-12-08 15:56:04 -08001867.Ic set Fl o
Geremy Condra03ebf062011-10-12 18:17:24 -07001868and
Elliott Hughes96b43632015-07-17 11:39:41 -07001869.Ic kill Fl l
Geremy Condra03ebf062011-10-12 18:17:24 -07001870commands to format information columns.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001871Importing from the environment or unsetting this parameter removes the
1872binding to the actual terminal size in favour of the provided value.
Geremy Condra03ebf062011-10-12 18:17:24 -07001873.It Ev ENV
1874If this parameter is found to be set after any profile files are executed, the
1875expanded value is used as a shell startup file.
1876It typically contains function and alias definitions.
Elliott Hughes77740fc2016-08-12 15:06:53 -07001877.It Ev EPOCHREALTIME
1878Time since the epoch, as returned by
1879.Xr gettimeofday 2 ,
1880formatted as decimal
1881.Va tv_sec
1882followed by a dot
Elliott Hughes966dd552016-12-08 15:56:04 -08001883.Pq Ql \&.
Elliott Hughes77740fc2016-08-12 15:06:53 -07001884and
1885.Va tv_usec
1886padded to exactly six decimal digits.
Geremy Condra03ebf062011-10-12 18:17:24 -07001887.It Ev EXECSHELL
1888If set, this parameter is assumed to contain the shell that is to be used to
1889execute commands that
1890.Xr execve 2
1891fails to execute and which do not start with a
Elliott Hughes966dd552016-12-08 15:56:04 -08001892.Dq Li #! Ns Ar shell
Geremy Condra03ebf062011-10-12 18:17:24 -07001893sequence.
1894.It Ev FCEDIT
1895The editor used by the
1896.Ic fc
1897command (see below).
1898.It Ev FPATH
1899Like
1900.Ev PATH ,
1901but used when an undefined function is executed to locate the file defining the
1902function.
1903It is also searched when a command can't be found using
1904.Ev PATH .
1905See
1906.Sx Functions
1907below for more information.
1908.It Ev HISTFILE
1909The name of the file used to store command history.
Elliott Hughesb27ce952015-04-21 13:39:18 -07001910When assigned to or unset, the file is opened, history is truncated
Elliott Hughes96b43632015-07-17 11:39:41 -07001911then loaded from the file; subsequent new commands (possibly consisting
1912of several lines) are appended once they successfully compiled.
Geremy Condra03ebf062011-10-12 18:17:24 -07001913Also, several invocations of the shell will share history if their
1914.Ev HISTFILE
1915parameters all point to the same file.
1916.Pp
1917.Sy Note :
1918If
1919.Ev HISTFILE
Elliott Hughesb27ce952015-04-21 13:39:18 -07001920is unset or empty, no history file is used.
Geremy Condra03ebf062011-10-12 18:17:24 -07001921This is different from
1922.At
1923.Nm ksh .
1924.It Ev HISTSIZE
1925The number of commands normally stored for history.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001926The default is 2047.
Elliott Hughes56b517d2014-10-06 11:30:44 -07001927Do not set this value to insanely high values such as 1000000000 because
1928.Nm
1929can then not allocate enough memory for the history and will not start.
Geremy Condra03ebf062011-10-12 18:17:24 -07001930.It Ev HOME
1931The default directory for the
1932.Ic cd
1933command and the value substituted for an unqualified
1934.Ic \*(TI
1935(see
1936.Sx Tilde expansion
1937below).
1938.It Ev IFS
1939Internal field separator, used during substitution and by the
1940.Ic read
Elliott Hughes966dd552016-12-08 15:56:04 -08001941command, to split values into distinct arguments; normally set to space, tab
Geremy Condra03ebf062011-10-12 18:17:24 -07001942and newline.
1943See
1944.Sx Substitution
1945above for details.
1946.Pp
1947.Sy Note :
1948This parameter is not imported from the environment when the shell is
1949started.
1950.It Ev KSHEGID
1951The effective group id of the shell.
1952.It Ev KSHGID
1953The real group id of the shell.
1954.It Ev KSHUID
1955The real user id of the shell.
Elliott Hughes77740fc2016-08-12 15:06:53 -07001956.It Ev KSH_MATCH
1957The last matched string.
1958In a future version, this will be an indexed array,
1959with indexes 1 and up capturing matching groups.
1960Set by string comparisons (== and !=) in double-bracket test
1961expressions when a match is found (when != returns false), by
1962.Ic case
1963when a match is encountered, and by the substitution operations
1964.Sm off
1965.Xo
1966.Pf ${ Ar x
1967.Pf # Ar pat No } ,
1968.Sm on
1969.Xc
1970.Sm off
1971.Xo
1972.Pf ${ Ar x
1973.Pf ## Ar pat No } ,
1974.Sm on
1975.Xc
1976.Sm off
1977.Xo
1978.Pf ${ Ar x
1979.Pf % Ar pat No } ,
1980.Sm on
1981.Xc
1982.Sm off
1983.Xo
1984.Pf ${ Ar x
1985.Pf %% Ar pat No } ,
1986.Sm on
1987.Xc
1988.Sm off
1989.Xo
1990.Pf ${ Ar x
1991.Pf / Ar pat / Ar rpl No } ,
1992.Sm on
1993.Xc
1994.Sm off
1995.Xo
1996.Pf ${ Ar x
1997.Pf /# Ar pat / Ar rpl No } ,
1998.Sm on
1999.Xc
2000.Sm off
2001.Xo
2002.Pf ${ Ar x
2003.Pf /% Ar pat / Ar rpl No } ,
2004.Sm on
2005.Xc
2006.Sm off
2007.Xo
2008.Pf ${ Ar x
2009.Pf // Ar pat / Ar rpl No } ,
2010.Sm on
2011.Xc
2012and
2013.Sm off
2014.Xo
2015.Pf ${ Ar x
2016.Pf @/ Ar pat / Ar rpl No } .
2017.Sm on
2018.Xc
2019See the end of the Emacs editing mode documentation for an example.
Geremy Condra03ebf062011-10-12 18:17:24 -07002020.It Ev KSH_VERSION
2021The name and version of the shell (read-only).
2022See also the version commands in
2023.Sx Emacs editing mode
2024and
2025.Sx Vi editing mode
2026sections, below.
2027.It Ev LINENO
2028The line number of the function or shell script that is currently being
2029executed.
2030.It Ev LINES
2031Set to the number of lines on the terminal or window.
Elliott Hughes47086262019-03-26 12:34:31 -07002032Defaults to 24; always set, unless imported or unset.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002033See
2034.Ev COLUMNS .
Geremy Condra03ebf062011-10-12 18:17:24 -07002035.It Ev OLDPWD
2036The previous working directory.
2037Unset if
2038.Ic cd
Elliott Hughes966dd552016-12-08 15:56:04 -08002039has not successfully changed directories since the shell started or if the
Geremy Condra03ebf062011-10-12 18:17:24 -07002040shell doesn't know where it is.
2041.It Ev OPTARG
2042When using
2043.Ic getopts ,
2044it contains the argument for a parsed option, if it requires one.
2045.It Ev OPTIND
2046The index of the next argument to be processed when using
2047.Ic getopts .
2048Assigning 1 to this parameter causes
2049.Ic getopts
2050to process arguments from the beginning the next time it is invoked.
2051.It Ev PATH
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002052A colon (semicolon on OS/2) separated list of directories that are
2053searched when looking for commands and files sourced using the
Elliott Hughes966dd552016-12-08 15:56:04 -08002054.Dq Li \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07002055command (see below).
2056An empty string resulting from a leading or trailing
Elliott Hughesa3c3f962017-04-12 16:52:30 -07002057(semi)colon, or two adjacent ones, is treated as a
Elliott Hughes966dd552016-12-08 15:56:04 -08002058.Dq Li \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07002059(the current directory).
Elliott Hughesa3c3f962017-04-12 16:52:30 -07002060.It Ev PATHSEP
2061A colon (semicolon on OS/2), for the user's convenience.
Geremy Condra03ebf062011-10-12 18:17:24 -07002062.It Ev PGRP
2063The process ID of the shell's process group leader.
2064.It Ev PIPESTATUS
2065An array containing the errorlevel (exit status) codes,
2066one by one, of the last pipeline run in the foreground.
2067.It Ev PPID
2068The process ID of the shell's parent.
2069.It Ev PS1
2070The primary prompt for interactive shells.
Elliott Hughes966dd552016-12-08 15:56:04 -08002071Parameter, command and arithmetic
Geremy Condra03ebf062011-10-12 18:17:24 -07002072substitutions are performed, and
2073.Ql \&!
2074is replaced with the current command number (see the
2075.Ic fc
2076command below).
2077A literal
2078.Ql \&!
2079can be put in the prompt by placing
Elliott Hughes966dd552016-12-08 15:56:04 -08002080.Dq Li !!
Geremy Condra03ebf062011-10-12 18:17:24 -07002081in
2082.Ev PS1 .
2083.Pp
2084The default prompt is
Elliott Hughes966dd552016-12-08 15:56:04 -08002085.Dq Li $\ \&
Geremy Condra03ebf062011-10-12 18:17:24 -07002086for non-root users,
Elliott Hughes966dd552016-12-08 15:56:04 -08002087.Dq Li #\ \&
Geremy Condra03ebf062011-10-12 18:17:24 -07002088for root.
2089If
2090.Nm
2091is invoked by root and
2092.Ev PS1
2093does not contain a
Elliott Hughes966dd552016-12-08 15:56:04 -08002094.Ql #
Geremy Condra03ebf062011-10-12 18:17:24 -07002095character, the default value will be used even if
2096.Ev PS1
2097already exists in the environment.
2098.Pp
2099The
2100.Nm
2101distribution comes with a sample
2102.Pa dot.mkshrc
2103containing a sophisticated example, but you might like the following one
2104(note that ${HOSTNAME:=$(hostname)} and the
2105root-vs-user distinguishing clause are (in this example) executed at
2106.Ev PS1
2107assignment time, while the $USER and $PWD are escaped
2108and thus will be evaluated each time a prompt is displayed):
2109.Bd -literal
2110PS1=\*(aq${USER:=$(id \-un)}\*(aq"@${HOSTNAME:=$(hostname)}:\e$PWD $(
2111 if (( USER_ID )); then print \e$; else print \e#; fi) "
2112.Ed
2113.Pp
2114Note that since the command-line editors try to figure out how long the prompt
2115is (so they know how far it is to the edge of the screen), escape codes in
2116the prompt tend to mess things up.
2117You can tell the shell not to count certain
2118sequences (such as escape codes) by prefixing your prompt with a
2119character (such as Ctrl-A) followed by a carriage return and then delimiting
2120the escape codes with this character.
Elliott Hughes96b43632015-07-17 11:39:41 -07002121Any occurrences of that character in the prompt are not printed.
Geremy Condra03ebf062011-10-12 18:17:24 -07002122By the way, don't blame me for
2123this hack; it's derived from the original
2124.Xr ksh88 1 ,
2125which did print the delimiter character so you were out of luck
2126if you did not have any non-printing characters.
2127.Pp
Elliott Hughes23925bb2017-09-22 16:04:20 -07002128Since backslashes and other special characters may be
Geremy Condra03ebf062011-10-12 18:17:24 -07002129interpreted by the shell, to set
2130.Ev PS1
Elliott Hughes966dd552016-12-08 15:56:04 -08002131either escape the backslash itself
Geremy Condra03ebf062011-10-12 18:17:24 -07002132or use double quotes.
2133The latter is more practical.
2134This is a more complex example,
2135avoiding to directly enter special characters (for example with
2136.Ic \*(haV
2137in the emacs editing mode),
2138which embeds the current working directory,
2139in reverse video
2140.Pq colour would work, too ,
2141in the prompt string:
2142.Bd -literal -offset indent
Elliott Hughes23925bb2017-09-22 16:04:20 -07002143x=$(print \e\e001) # otherwise unused char
Elliott Hughes737fdce2014-08-07 12:59:26 -07002144PS1="$x$(print \e\er)$x$(tput so)$x\e$PWD$x$(tput se)$x\*(Gt "
Geremy Condra03ebf062011-10-12 18:17:24 -07002145.Ed
2146.Pp
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002147Due to a strong suggestion from David G. Korn,
Geremy Condra03ebf062011-10-12 18:17:24 -07002148.Nm
2149now also supports the following form:
2150.Bd -literal -offset indent
Elliott Hughesa3c3f962017-04-12 16:52:30 -07002151PS1=$\*(aq\e1\er\e1\ee[7m\e1$PWD\e1\ee[0m\e1\*(Gt \*(aq
Geremy Condra03ebf062011-10-12 18:17:24 -07002152.Ed
2153.It Ev PS2
2154Secondary prompt string, by default
Elliott Hughes966dd552016-12-08 15:56:04 -08002155.Dq Li \*(Gt\ \& ,
Geremy Condra03ebf062011-10-12 18:17:24 -07002156used when more input is needed to complete a command.
2157.It Ev PS3
2158Prompt used by the
2159.Ic select
2160statement when reading a menu selection.
2161The default is
Elliott Hughes966dd552016-12-08 15:56:04 -08002162.Dq Li #?\ \& .
Geremy Condra03ebf062011-10-12 18:17:24 -07002163.It Ev PS4
2164Used to prefix commands that are printed during execution tracing (see the
2165.Ic set Fl x
2166command below).
Elliott Hughes966dd552016-12-08 15:56:04 -08002167Parameter, command and arithmetic substitutions are performed
Geremy Condra03ebf062011-10-12 18:17:24 -07002168before it is printed.
2169The default is
Elliott Hughes966dd552016-12-08 15:56:04 -08002170.Dq Li +\ \& .
Thorsten Glaser811a5752013-07-25 14:24:45 +00002171You may want to set it to
Elliott Hughes966dd552016-12-08 15:56:04 -08002172.Dq Li \&[$EPOCHREALTIME]\ \&
Thorsten Glaser811a5752013-07-25 14:24:45 +00002173instead, to include timestamps.
Geremy Condra03ebf062011-10-12 18:17:24 -07002174.It Ev PWD
2175The current working directory.
Elliott Hughes966dd552016-12-08 15:56:04 -08002176May be unset or empty if the shell doesn't know where it is.
Geremy Condra03ebf062011-10-12 18:17:24 -07002177.It Ev RANDOM
2178Each time
2179.Ev RANDOM
2180is referenced, it is assigned a number between 0 and 32767 from
2181a Linear Congruential PRNG first.
2182.It Ev REPLY
2183Default parameter for the
2184.Ic read
2185command if no names are given.
2186Also used in
2187.Ic select
2188loops to store the value that is read from standard input.
2189.It Ev SECONDS
2190The number of seconds since the shell started or, if the parameter has been
2191assigned an integer value, the number of seconds since the assignment plus the
2192value that was assigned.
2193.It Ev TMOUT
2194If set to a positive integer in an interactive shell, it specifies the maximum
2195number of seconds the shell will wait for input after printing the primary
2196prompt
2197.Pq Ev PS1 .
2198If the time is exceeded, the shell exits.
2199.It Ev TMPDIR
2200The directory temporary shell files are created in.
2201If this parameter is not
Elliott Hughes966dd552016-12-08 15:56:04 -08002202set or does not contain the absolute path of a writable directory, temporary
Geremy Condra03ebf062011-10-12 18:17:24 -07002203files are created in
2204.Pa /tmp .
2205.It Ev USER_ID
2206The effective user id of the shell.
2207.El
2208.Ss Tilde expansion
Elliott Hughesa3c3f962017-04-12 16:52:30 -07002209Tilde expansion, which is done in parallel with parameter substitution,
2210is applied to words starting with an unquoted
Geremy Condra03ebf062011-10-12 18:17:24 -07002211.Ql \*(TI .
Elliott Hughesa3c3f962017-04-12 16:52:30 -07002212In parameter assignments (such as those preceding a simple-command or those
2213occurring in the arguments of a declaration utility), tilde expansion is done
2214after any assignment (i.e. after the equals sign) or after an unquoted colon
2215.Pq Ql \&: ;
2216login names are also delimited by colons.
2217The Korn shell, except in POSIX mode, always expands tildes after unquoted
2218equals signs, not just in assignment context (see below), and enables tab
2219completion for tildes after all unquoted colons during command line editing.
2220.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07002221The characters following the tilde, up to the first
2222.Ql / ,
2223if any, are assumed to be a login name.
2224If the login name is empty,
Elliott Hughes966dd552016-12-08 15:56:04 -08002225.Ql +
Geremy Condra03ebf062011-10-12 18:17:24 -07002226or
2227.Ql \- ,
Elliott Hughes77740fc2016-08-12 15:06:53 -07002228the simplified value of the
Geremy Condra03ebf062011-10-12 18:17:24 -07002229.Ev HOME ,
Elliott Hughes966dd552016-12-08 15:56:04 -08002230.Ev PWD
Geremy Condra03ebf062011-10-12 18:17:24 -07002231or
2232.Ev OLDPWD
2233parameter is substituted, respectively.
2234Otherwise, the password file is
2235searched for the login name, and the tilde expression is substituted with the
2236user's home directory.
2237If the login name is not found in the password file or
2238if any quoting or parameter substitution occurs in the login name, no
2239substitution is performed.
2240.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07002241The home directory of previously expanded login names are cached and re-used.
2242The
Elliott Hughes96b43632015-07-17 11:39:41 -07002243.Ic alias Fl d
Elliott Hughes966dd552016-12-08 15:56:04 -08002244command may be used to list, change and add to this cache (e.g.\&
Geremy Condra03ebf062011-10-12 18:17:24 -07002245.Ic alias \-d fac=/usr/local/facilities; cd \*(TIfac/bin ) .
Elliott Hughes96b43632015-07-17 11:39:41 -07002246.Ss Brace expansion (alternation)
Geremy Condra03ebf062011-10-12 18:17:24 -07002247Brace expressions take the following form:
2248.Bd -unfilled -offset indent
2249.Sm off
2250.Xo
2251.Ar prefix No { Ar str1 No ,...,
2252.Ar strN No } Ar suffix
2253.Xc
2254.Sm on
2255.Ed
2256.Pp
2257The expressions are expanded to
2258.Ar N
2259words, each of which is the concatenation of
2260.Ar prefix ,
Elliott Hughes966dd552016-12-08 15:56:04 -08002261.Ar str Ns i
Geremy Condra03ebf062011-10-12 18:17:24 -07002262and
2263.Ar suffix
2264(e.g.\&
Elliott Hughes966dd552016-12-08 15:56:04 -08002265.Dq Li a{c,b{X,Y},d}e
Geremy Condra03ebf062011-10-12 18:17:24 -07002266expands to four words:
Elliott Hughes966dd552016-12-08 15:56:04 -08002267.Dq Li ace ,
2268.Dq Li abXe ,
2269.Dq Li abYe
Geremy Condra03ebf062011-10-12 18:17:24 -07002270and
Elliott Hughes966dd552016-12-08 15:56:04 -08002271.Dq Li ade ) .
Geremy Condra03ebf062011-10-12 18:17:24 -07002272As noted in the example, brace expressions can be nested and the resulting
2273words are not sorted.
2274Brace expressions must contain an unquoted comma
Elliott Hughes966dd552016-12-08 15:56:04 -08002275.Pq Ql \&,
Geremy Condra03ebf062011-10-12 18:17:24 -07002276for expansion to occur (e.g.\&
2277.Ic {}
2278and
2279.Ic {foo}
2280are not expanded).
2281Brace expansion is carried out after parameter substitution
2282and before file name generation.
2283.Ss File name patterns
2284A file name pattern is a word containing one or more unquoted
2285.Ql \&? ,
2286.Ql * ,
2287.Ql + ,
Elliott Hughes966dd552016-12-08 15:56:04 -08002288.Ql @
Geremy Condra03ebf062011-10-12 18:17:24 -07002289or
2290.Ql \&!
2291characters or
Elliott Hughes966dd552016-12-08 15:56:04 -08002292.Dq Li \&[...]
Geremy Condra03ebf062011-10-12 18:17:24 -07002293sequences.
2294Once brace expansion has been performed, the shell replaces file
2295name patterns with the sorted names of all the files that match the pattern
2296(if no files match, the word is left unchanged).
2297The pattern elements have the following meaning:
2298.Bl -tag -width Ds
2299.It \&?
2300Matches any single character.
2301.It \&*
2302Matches any sequence of octets.
Elliott Hughes966dd552016-12-08 15:56:04 -08002303.It \&[...]
Geremy Condra03ebf062011-10-12 18:17:24 -07002304Matches any of the octets inside the brackets.
2305Ranges of octets can be specified by separating two octets by a
2306.Ql \-
2307(e.g.\&
Elliott Hughes966dd552016-12-08 15:56:04 -08002308.Dq Li \&[a0\-9]
Geremy Condra03ebf062011-10-12 18:17:24 -07002309matches the letter
Elliott Hughes966dd552016-12-08 15:56:04 -08002310.Ql a
Geremy Condra03ebf062011-10-12 18:17:24 -07002311or any digit).
2312In order to represent itself, a
2313.Ql \-
2314must either be quoted or the first or last octet in the octet list.
2315Similarly, a
2316.Ql \&]
2317must be quoted or the first octet in the list if it is to represent itself
2318instead of the end of the list.
2319Also, a
2320.Ql \&!
2321appearing at the start of the list has special meaning (see below), so to
2322represent itself it must be quoted or appear later in the list.
Elliott Hughes966dd552016-12-08 15:56:04 -08002323.It \&[!...]
2324Like [...],
Geremy Condra03ebf062011-10-12 18:17:24 -07002325except it matches any octet not inside the brackets.
2326.Sm off
2327.It *( Ar pattern\*(Ba No ...\*(Ba Ar pattern )
2328.Sm on
2329Matches any string of octets that matches zero or more occurrences of the
2330specified patterns.
2331Example: The pattern
2332.Ic *(foo\*(Babar)
2333matches the strings
2334.Dq ,
Elliott Hughes966dd552016-12-08 15:56:04 -08002335.Dq Li foo ,
2336.Dq Li bar ,
2337.Dq Li foobarfoo ,
Geremy Condra03ebf062011-10-12 18:17:24 -07002338etc.
2339.Sm off
2340.It +( Ar pattern\*(Ba No ...\*(Ba Ar pattern )
2341.Sm on
2342Matches any string of octets that matches one or more occurrences of the
2343specified patterns.
2344Example: The pattern
2345.Ic +(foo\*(Babar)
2346matches the strings
Elliott Hughes966dd552016-12-08 15:56:04 -08002347.Dq Li foo ,
2348.Dq Li bar ,
2349.Dq Li foobar ,
Geremy Condra03ebf062011-10-12 18:17:24 -07002350etc.
2351.Sm off
2352.It ?( Ar pattern\*(Ba No ...\*(Ba Ar pattern )
2353.Sm on
2354Matches the empty string or a string that matches one of the specified
2355patterns.
2356Example: The pattern
2357.Ic ?(foo\*(Babar)
2358only matches the strings
2359.Dq ,
Elliott Hughes966dd552016-12-08 15:56:04 -08002360.Dq Li foo
Geremy Condra03ebf062011-10-12 18:17:24 -07002361and
Elliott Hughes966dd552016-12-08 15:56:04 -08002362.Dq Li bar .
Geremy Condra03ebf062011-10-12 18:17:24 -07002363.Sm off
2364.It @( Ar pattern\*(Ba No ...\*(Ba Ar pattern )
2365.Sm on
2366Matches a string that matches one of the specified patterns.
2367Example: The pattern
2368.Ic @(foo\*(Babar)
2369only matches the strings
Elliott Hughes966dd552016-12-08 15:56:04 -08002370.Dq Li foo
Geremy Condra03ebf062011-10-12 18:17:24 -07002371and
Elliott Hughes966dd552016-12-08 15:56:04 -08002372.Dq Li bar .
Geremy Condra03ebf062011-10-12 18:17:24 -07002373.Sm off
2374.It !( Ar pattern\*(Ba No ...\*(Ba Ar pattern )
2375.Sm on
2376Matches any string that does not match one of the specified patterns.
2377Examples: The pattern
2378.Ic !(foo\*(Babar)
2379matches all strings except
Elliott Hughes966dd552016-12-08 15:56:04 -08002380.Dq Li foo
Geremy Condra03ebf062011-10-12 18:17:24 -07002381and
Elliott Hughes966dd552016-12-08 15:56:04 -08002382.Dq Li bar ;
Geremy Condra03ebf062011-10-12 18:17:24 -07002383the pattern
Elliott Hughes966dd552016-12-08 15:56:04 -08002384.Ic \&!(*)
Geremy Condra03ebf062011-10-12 18:17:24 -07002385matches no strings; the pattern
Elliott Hughes966dd552016-12-08 15:56:04 -08002386.Ic \&!(?)*
Geremy Condra03ebf062011-10-12 18:17:24 -07002387matches all strings (think about it).
2388.El
2389.Pp
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002390Note that complicated globbing, especially with alternatives,
2391is slow; using separate comparisons may (or may not) be faster.
2392.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07002393Note that
2394.Nm mksh
2395.Po and Nm pdksh Pc
2396never matches
Elliott Hughes966dd552016-12-08 15:56:04 -08002397.Dq Li \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07002398and
Elliott Hughes966dd552016-12-08 15:56:04 -08002399.Dq Li .. ,
Geremy Condra03ebf062011-10-12 18:17:24 -07002400but
2401.At
2402.Nm ksh ,
2403Bourne
Elliott Hughes966dd552016-12-08 15:56:04 -08002404.Nm sh
Geremy Condra03ebf062011-10-12 18:17:24 -07002405and GNU
2406.Nm bash
2407do.
2408.Pp
2409Note that none of the above pattern elements match either a period
Elliott Hughes966dd552016-12-08 15:56:04 -08002410.Pq Ql \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07002411at the start of a file name or a slash
Elliott Hughes966dd552016-12-08 15:56:04 -08002412.Pq Ql / ,
2413even if they are explicitly used in a [...] sequence; also, the names
2414.Dq Li \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07002415and
Elliott Hughes966dd552016-12-08 15:56:04 -08002416.Dq Li ..
Geremy Condra03ebf062011-10-12 18:17:24 -07002417are never matched, even by the pattern
Elliott Hughes966dd552016-12-08 15:56:04 -08002418.Dq Li .* .
Geremy Condra03ebf062011-10-12 18:17:24 -07002419.Pp
2420If the
2421.Ic markdirs
2422option is set, any directories that result from file name generation are marked
2423with a trailing
2424.Ql / .
2425.Ss Input/output redirection
Elliott Hughes966dd552016-12-08 15:56:04 -08002426When a command is executed, its standard input, standard output and standard
2427error (file descriptors 0, 1 and 2, respectively) are normally inherited from
Geremy Condra03ebf062011-10-12 18:17:24 -07002428the shell.
2429Three exceptions to this are commands in pipelines, for which
2430standard input and/or standard output are those set up by the pipeline,
2431asynchronous commands created when job control is disabled, for which standard
Elliott Hughes966dd552016-12-08 15:56:04 -08002432input is initially set to
Geremy Condra03ebf062011-10-12 18:17:24 -07002433.Pa /dev/null ,
2434and commands for which any of the following redirections have been specified:
2435.Bl -tag -width XXxxmarker
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002436.It \*(Gt Ns Ar file
Geremy Condra03ebf062011-10-12 18:17:24 -07002437Standard output is redirected to
2438.Ar file .
2439If
2440.Ar file
2441does not exist, it is created; if it does exist, is a regular file, and the
2442.Ic noclobber
2443option is set, an error occurs; otherwise, the file is truncated.
2444Note that this means the command
2445.Ic cmd \*(Ltfoo \*(Gtfoo
2446will open
2447.Ar foo
2448for reading and then truncate it when it opens it for writing, before
2449.Ar cmd
2450gets a chance to actually read
2451.Ar foo .
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002452.It \*(Gt\*(Ba Ns Ar file
Geremy Condra03ebf062011-10-12 18:17:24 -07002453Same as
2454.Ic \*(Gt ,
2455except the file is truncated, even if the
2456.Ic noclobber
2457option is set.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002458.It \*(Gt\*(Gt Ns Ar file
Geremy Condra03ebf062011-10-12 18:17:24 -07002459Same as
2460.Ic \*(Gt ,
2461except if
2462.Ar file
2463exists it is appended to instead of being truncated.
2464Also, the file is opened
2465in append mode, so writes always go to the end of the file (see
2466.Xr open 2 ) .
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002467.It \*(Lt Ns Ar file
Geremy Condra03ebf062011-10-12 18:17:24 -07002468Standard input is redirected from
2469.Ar file ,
2470which is opened for reading.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002471.It \*(Lt\*(Gt Ns Ar file
Geremy Condra03ebf062011-10-12 18:17:24 -07002472Same as
2473.Ic \*(Lt ,
2474except the file is opened for reading and writing.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002475.It \*(Lt\*(Lt Ns Ar marker
Geremy Condra03ebf062011-10-12 18:17:24 -07002476After reading the command line containing this kind of redirection (called a
2477.Dq here document ) ,
2478the shell copies lines from the command source into a temporary file until a
2479line matching
2480.Ar marker
2481is read.
2482When the command is executed, standard input is redirected from the
2483temporary file.
2484If
2485.Ar marker
2486contains no quoted characters, the contents of the temporary file are processed
2487as if enclosed in double quotes each time the command is executed, so
Elliott Hughes966dd552016-12-08 15:56:04 -08002488parameter, command and arithmetic substitutions are performed, along with
Geremy Condra03ebf062011-10-12 18:17:24 -07002489backslash
Elliott Hughes966dd552016-12-08 15:56:04 -08002490.Pq Ql \e
Geremy Condra03ebf062011-10-12 18:17:24 -07002491escapes for
2492.Ql $ ,
2493.Ql \` ,
Elliott Hughes966dd552016-12-08 15:56:04 -08002494.Ql \e
Geremy Condra03ebf062011-10-12 18:17:24 -07002495and
Elliott Hughes966dd552016-12-08 15:56:04 -08002496.Dq Li \enewline ,
Geremy Condra03ebf062011-10-12 18:17:24 -07002497but not for
2498.Ql \&" .
2499If multiple here documents are used on the same command line, they are saved in
2500order.
2501.Pp
2502If no
2503.Ar marker
2504is given, the here document ends at the next
2505.Ic \*(Lt\*(Lt
2506and substitution will be performed.
2507If
2508.Ar marker
2509is only a set of either single
Elliott Hughes966dd552016-12-08 15:56:04 -08002510.Dq Li \*(aq\*(aq
Geremy Condra03ebf062011-10-12 18:17:24 -07002511or double
Elliott Hughes966dd552016-12-08 15:56:04 -08002512.Ql \&""
Geremy Condra03ebf062011-10-12 18:17:24 -07002513quotes with nothing in between, the here document ends at the next empty line
2514and substitution will not be performed.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002515.It \*(Lt\*(Lt\- Ns Ar marker
Geremy Condra03ebf062011-10-12 18:17:24 -07002516Same as
2517.Ic \*(Lt\*(Lt ,
2518except leading tabs are stripped from lines in the here document.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002519.It \*(Lt\*(Lt\*(Lt Ns Ar word
Geremy Condra03ebf062011-10-12 18:17:24 -07002520Same as
2521.Ic \*(Lt\*(Lt ,
2522except that
2523.Ar word
2524.Em is
2525the here document.
2526This is called a here string.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002527.It \*(Lt& Ns Ar fd
Geremy Condra03ebf062011-10-12 18:17:24 -07002528Standard input is duplicated from file descriptor
2529.Ar fd .
2530.Ar fd
Elliott Hughes77740fc2016-08-12 15:06:53 -07002531can be a single digit, indicating the number of an existing file descriptor;
Geremy Condra03ebf062011-10-12 18:17:24 -07002532the letter
2533.Ql p ,
2534indicating the file descriptor associated with the output of the current
2535co-process; or the character
2536.Ql \- ,
2537indicating standard input is to be closed.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002538.It \*(Gt& Ns Ar fd
Geremy Condra03ebf062011-10-12 18:17:24 -07002539Same as
2540.Ic \*(Lt& ,
2541except the operation is done on standard output.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002542.It &\*(Gt Ns Ar file
Geremy Condra03ebf062011-10-12 18:17:24 -07002543Same as
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002544.Ic \*(Gt Ns Ar file 2\*(Gt&1 .
2545This is a deprecated (legacy) GNU
Geremy Condra03ebf062011-10-12 18:17:24 -07002546.Nm bash
2547extension supported by
2548.Nm
Elliott Hughes77740fc2016-08-12 15:06:53 -07002549which also supports the preceding explicit fd digit, for example,
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002550.Ic 3&\*(Gt Ns Ar file
Geremy Condra03ebf062011-10-12 18:17:24 -07002551is the same as
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002552.Ic 3\*(Gt Ns Ar file 2\*(Gt&3
Geremy Condra03ebf062011-10-12 18:17:24 -07002553in
2554.Nm
2555but a syntax error in GNU
2556.Nm bash .
2557.It Xo
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002558.No &\*(Gt\*(Ba Ns Ar file ,
2559.No &\*(Gt\*(Gt Ns Ar file ,
2560.No &\*(Gt& Ns Ar fd
Geremy Condra03ebf062011-10-12 18:17:24 -07002561.Xc
2562Same as
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002563.Ic \*(Gt\*(Ba Ns Ar file ,
Elliott Hughes966dd552016-12-08 15:56:04 -08002564.Ic \*(Gt\*(Gt Ns Ar file
Geremy Condra03ebf062011-10-12 18:17:24 -07002565or
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002566.Ic \*(Gt& Ns Ar fd ,
Geremy Condra03ebf062011-10-12 18:17:24 -07002567followed by
2568.Ic 2\*(Gt&1 ,
2569as above.
2570These are
2571.Nm
2572extensions.
2573.El
2574.Pp
2575In any of the above redirections, the file descriptor that is redirected
2576(i.e. standard input or standard output)
2577can be explicitly given by preceding the
Elliott Hughes77740fc2016-08-12 15:06:53 -07002578redirection with a single digit.
Elliott Hughes966dd552016-12-08 15:56:04 -08002579Parameter, command and arithmetic
2580substitutions, tilde substitutions, and, if the shell is interactive,
Geremy Condra03ebf062011-10-12 18:17:24 -07002581file name generation are all performed on the
2582.Ar file ,
Elliott Hughes966dd552016-12-08 15:56:04 -08002583.Ar marker
Geremy Condra03ebf062011-10-12 18:17:24 -07002584and
2585.Ar fd
2586arguments of redirections.
2587Note, however, that the results of any file name
2588generation are only used if a single file is matched; if multiple files match,
2589the word with the expanded file name generation characters is used.
2590Note
2591that in restricted shells, redirections which can create files cannot be used.
2592.Pp
2593For simple-commands, redirections may appear anywhere in the command; for
2594compound-commands
2595.Po
2596.Ic if
2597statements, etc.
2598.Pc ,
2599any redirections must appear at the end.
2600Redirections are processed after
2601pipelines are created and in the order they are given, so the following
2602will print an error with a line number prepended to it:
2603.Pp
Elliott Hughesa3c3f962017-04-12 16:52:30 -07002604.Dl $ cat /foo/bar 2\*(Gt&1 \*(Gt/dev/null \*(Ba pr \-n \-t
Geremy Condra03ebf062011-10-12 18:17:24 -07002605.Pp
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002606File descriptors created by I/O redirections are private to the shell.
Geremy Condra03ebf062011-10-12 18:17:24 -07002607.Ss Arithmetic expressions
2608Integer arithmetic expressions can be used with the
2609.Ic let
Elliott Hughes966dd552016-12-08 15:56:04 -08002610command, inside $((...)) expressions, inside array references (e.g.\&
Geremy Condra03ebf062011-10-12 18:17:24 -07002611.Ar name Ns Bq Ar expr ) ,
2612as numeric arguments to the
2613.Ic test
2614command, and as the value of an assignment to an integer parameter.
Elliott Hughesf7f79562014-10-07 15:04:14 -07002615.Em Warning :
2616This also affects implicit conversion to integer, for example as done by the
2617.Ic let
2618command.
2619.Em Never
Elliott Hughes966dd552016-12-08 15:56:04 -08002620use unchecked user input, e.g. from the environment, in an arithmetic context!
Geremy Condra03ebf062011-10-12 18:17:24 -07002621.Pp
2622Expressions are calculated using signed arithmetic and the
2623.Vt mksh_ari_t
2624type (a 32-bit signed integer), unless they begin with a sole
Elliott Hughes966dd552016-12-08 15:56:04 -08002625.Ql #
Geremy Condra03ebf062011-10-12 18:17:24 -07002626character, in which case they use
2627.Vt mksh_uari_t
2628.Po a 32-bit unsigned integer Pc .
2629.Pp
Elliott Hughes966dd552016-12-08 15:56:04 -08002630Expressions may contain alpha-numeric parameter identifiers, array references
Geremy Condra03ebf062011-10-12 18:17:24 -07002631and integer constants and may be combined with the following C operators
2632(listed and grouped in increasing order of precedence):
2633.Pp
2634Unary operators:
2635.Bd -literal -offset indent
2636+ \- ! \*(TI ++ \-\-
2637.Ed
2638.Pp
2639Binary operators:
2640.Bd -literal -offset indent
2641,
Elliott Hughes77740fc2016-08-12 15:06:53 -07002642= += \-= *= /= %= \*(Lt\*(Lt= \*(Gt\*(Gt= \*(ha\*(Lt= \*(ha\*(Gt= &= \*(ha= \*(Ba=
Geremy Condra03ebf062011-10-12 18:17:24 -07002643\*(Ba\*(Ba
2644&&
2645\*(Ba
2646\*(ha
2647&
2648== !=
Thorsten Glaser811a5752013-07-25 14:24:45 +00002649\*(Lt \*(Lt= \*(Gt \*(Gt=
Elliott Hughes77740fc2016-08-12 15:06:53 -07002650\*(Lt\*(Lt \*(Gt\*(Gt \*(ha\*(Lt \*(ha\*(Gt
Geremy Condra03ebf062011-10-12 18:17:24 -07002651+ \-
2652* / %
2653.Ed
2654.Pp
2655Ternary operators:
2656.Bd -literal -offset indent
2657?: (precedence is immediately higher than assignment)
2658.Ed
2659.Pp
2660Grouping operators:
2661.Bd -literal -offset indent
2662( )
2663.Ed
2664.Pp
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002665Integer constants and expressions are calculated using an exactly 32-bit
2666wide, signed or unsigned, type with silent wraparound on integer overflow.
Geremy Condra03ebf062011-10-12 18:17:24 -07002667Integer constants may be specified with arbitrary bases using the notation
2668.Ar base Ns # Ns Ar number ,
2669where
2670.Ar base
Elliott Hughes77740fc2016-08-12 15:06:53 -07002671is a decimal integer specifying the base (up to 36), and
Geremy Condra03ebf062011-10-12 18:17:24 -07002672.Ar number
2673is a number in the specified base.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002674Additionally, base-16 integers may be specified by prefixing them with
Elliott Hughes966dd552016-12-08 15:56:04 -08002675.Dq Li 0x
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002676.Pq case-insensitive
2677in all forms of arithmetic expressions, except as numeric arguments to the
Geremy Condra03ebf062011-10-12 18:17:24 -07002678.Ic test
Elliott Hughes77740fc2016-08-12 15:06:53 -07002679built-in utility.
Thorsten Glaser811a5752013-07-25 14:24:45 +00002680Prefixing numbers with a sole digit zero
Elliott Hughes966dd552016-12-08 15:56:04 -08002681.Pq Dq Li 0
Elliott Hughes77740fc2016-08-12 15:06:53 -07002682does not cause interpretation as octal (except in POSIX mode,
2683as required by the standard), as that's unsafe to do.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002684.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07002685As a special
2686.Nm mksh
2687extension, numbers to the base of one are treated as either (8-bit
Elliott Hughes47086262019-03-26 12:34:31 -07002688transparent) ASCII or Universal Coded Character Set codepoints,
2689depending on the shell's
Geremy Condra03ebf062011-10-12 18:17:24 -07002690.Ic utf8\-mode
2691flag (current setting).
2692The
2693.At
2694.Nm ksh93
2695syntax of
Elliott Hughes966dd552016-12-08 15:56:04 -08002696.Dq Li \*(aqx\*(aq
Geremy Condra03ebf062011-10-12 18:17:24 -07002697instead of
Elliott Hughes966dd552016-12-08 15:56:04 -08002698.Dq Li 1#x
Geremy Condra03ebf062011-10-12 18:17:24 -07002699is also supported.
2700Note that NUL bytes (integral value of zero) cannot be used.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002701An unset or empty parameter evaluates to 0 in integer context.
Elliott Hughes47086262019-03-26 12:34:31 -07002702In UTF-8 mode, raw octets are mapped into the range EF80..EFFF as in
Geremy Condra03ebf062011-10-12 18:17:24 -07002703OPTU-8, which is in the PUA and has been assigned by CSUR for this use.
2704If more than one octet in ASCII mode, or a sequence of more than one
2705octet not forming a valid and minimal CESU-8 sequence is passed, the
2706behaviour is undefined (usually, the shell aborts with a parse error,
2707but rarely, it succeeds, e.g. on the sequence C2 20).
2708That's why you should always use ASCII mode unless you know that the
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002709input is well-formed UTF-8 in the range of 0000..FFFD if you use this
2710feature, as opposed to
2711.Ic read Fl a .
Geremy Condra03ebf062011-10-12 18:17:24 -07002712.Pp
2713The operators are evaluated as follows:
2714.Bl -tag -width Ds -offset indent
2715.It unary +
2716Result is the argument (included for completeness).
2717.It unary \-
2718Negation.
2719.It \&!
2720Logical NOT;
2721the result is 1 if argument is zero, 0 if not.
2722.It \*(TI
2723Arithmetic (bit-wise) NOT.
2724.It ++
2725Increment; must be applied to a parameter (not a literal or other expression).
2726The parameter is incremented by 1.
2727When used as a prefix operator, the result
2728is the incremented value of the parameter; when used as a postfix operator, the
2729result is the original value of the parameter.
2730.It \-\-
2731Similar to
2732.Ic ++ ,
2733except the parameter is decremented by 1.
2734.It \&,
2735Separates two arithmetic expressions; the left-hand side is evaluated first,
2736then the right.
2737The result is the value of the expression on the right-hand side.
2738.It =
2739Assignment; the variable on the left is set to the value on the right.
2740.It Xo
Elliott Hughes77740fc2016-08-12 15:06:53 -07002741.No += \-= *= /= %= \*(Lt\*(Lt= \*(Gt\*(Gt=
2742.No \*(ha\*(Lt= \*(ha\*(Gt= &= \*(ha= \*(Ba=
Geremy Condra03ebf062011-10-12 18:17:24 -07002743.Xc
2744Assignment operators.
2745.Sm off
2746.Ao Ar var Ac Xo
2747.Aq Ar op
2748.No = Aq Ar expr
2749.Xc
2750.Sm on
2751is the same as
2752.Sm off
2753.Ao Ar var Ac Xo
2754.No = Aq Ar var
2755.Aq Ar op
2756.Aq Ar expr ,
2757.Xc
2758.Sm on
2759with any operator precedence in
2760.Aq Ar expr
2761preserved.
2762For example,
Elliott Hughes966dd552016-12-08 15:56:04 -08002763.Dq Li var1 *= 5 + 3
Geremy Condra03ebf062011-10-12 18:17:24 -07002764is the same as specifying
Elliott Hughes966dd552016-12-08 15:56:04 -08002765.Dq Li var1 = var1 * (5 + 3) .
Geremy Condra03ebf062011-10-12 18:17:24 -07002766.It \*(Ba\*(Ba
2767Logical OR;
2768the result is 1 if either argument is non-zero, 0 if not.
2769The right argument is evaluated only if the left argument is zero.
2770.It &&
2771Logical AND;
2772the result is 1 if both arguments are non-zero, 0 if not.
2773The right argument is evaluated only if the left argument is non-zero.
2774.It \*(Ba
2775Arithmetic (bit-wise) OR.
2776.It \*(ha
2777Arithmetic (bit-wise) XOR
2778(exclusive-OR).
2779.It &
2780Arithmetic (bit-wise) AND.
2781.It ==
2782Equal; the result is 1 if both arguments are equal, 0 if not.
2783.It !=
2784Not equal; the result is 0 if both arguments are equal, 1 if not.
2785.It \*(Lt
2786Less than; the result is 1 if the left argument is less than the right, 0 if
2787not.
Thorsten Glaser811a5752013-07-25 14:24:45 +00002788.It \*(Lt= \*(Gt \*(Gt=
Elliott Hughes56b517d2014-10-06 11:30:44 -07002789Less than or equal, greater than, greater than or equal.
Geremy Condra03ebf062011-10-12 18:17:24 -07002790See
2791.Ic \*(Lt .
Elliott Hughes77740fc2016-08-12 15:06:53 -07002792.It \*(Lt\*(Lt \*(Gt\*(Gt
2793Shift left (right); the result is the left argument with its bits
2794arithmetically (signed operation) or logically (unsigned expression)
2795shifted left (right) by the amount given in the right argument.
2796.It \*(ha\*(Lt \*(ha\*(Gt
2797Rotate left (right); the result is similar to shift,
Thorsten Glaser811a5752013-07-25 14:24:45 +00002798except that the bits shifted out at one end are shifted in
2799at the other end, instead of zero or sign bits.
Geremy Condra03ebf062011-10-12 18:17:24 -07002800.It + \- * /
Elliott Hughes966dd552016-12-08 15:56:04 -08002801Addition, subtraction, multiplication and division.
Geremy Condra03ebf062011-10-12 18:17:24 -07002802.It %
Elliott Hughes56b517d2014-10-06 11:30:44 -07002803Remainder; the result is the symmetric remainder of the division of the left
2804argument by the right.
2805To get the mathematical modulus of
2806.Dq a Ic mod No b ,
2807use the formula
2808.Do
2809.Pq a % b + b
2810.No % b
2811.Dc .
Geremy Condra03ebf062011-10-12 18:17:24 -07002812.It Xo
2813.Sm off
2814.Aq Ar arg1 ?
2815.Aq Ar arg2 :
2816.Aq Ar arg3
2817.Sm on
2818.Xc
2819If
2820.Aq Ar arg1
2821is non-zero, the result is
2822.Aq Ar arg2 ;
2823otherwise the result is
2824.Aq Ar arg3 .
Thorsten Glaser811a5752013-07-25 14:24:45 +00002825The non-result argument is not evaluated.
Geremy Condra03ebf062011-10-12 18:17:24 -07002826.El
2827.Ss Co-processes
2828A co-process (which is a pipeline created with the
Elliott Hughes966dd552016-12-08 15:56:04 -08002829.Dq Li \*(Ba&
Geremy Condra03ebf062011-10-12 18:17:24 -07002830operator) is an asynchronous process that the shell can both write to (using
Elliott Hughes96b43632015-07-17 11:39:41 -07002831.Ic print Fl p )
Geremy Condra03ebf062011-10-12 18:17:24 -07002832and read from (using
Elliott Hughes96b43632015-07-17 11:39:41 -07002833.Ic read Fl p ) .
Geremy Condra03ebf062011-10-12 18:17:24 -07002834The input and output of the co-process can also be manipulated using
2835.Ic \*(Gt&p
2836and
2837.Ic \*(Lt&p
2838redirections, respectively.
2839Once a co-process has been started, another can't
2840be started until the co-process exits, or until the co-process's input has been
2841redirected using an
2842.Ic exec Ar n Ns Ic \*(Gt&p
2843redirection.
2844If a co-process's input is redirected in this way, the next
2845co-process to be started will share the output with the first co-process,
2846unless the output of the initial co-process has been redirected using an
2847.Ic exec Ar n Ns Ic \*(Lt&p
2848redirection.
2849.Pp
2850Some notes concerning co-processes:
2851.Bl -bullet
2852.It
2853The only way to close the co-process's input (so the co-process reads an
2854end-of-file) is to redirect the input to a numbered file descriptor and then
2855close that file descriptor:
2856.Ic exec 3\*(Gt&p; exec 3\*(Gt&\-
2857.It
2858In order for co-processes to share a common output, the shell must keep the
2859write portion of the output pipe open.
2860This means that end-of-file will not be
2861detected until all co-processes sharing the co-process's output have exited
2862(when they all exit, the shell closes its copy of the pipe).
2863This can be
2864avoided by redirecting the output to a numbered file descriptor (as this also
2865causes the shell to close its copy).
2866Note that this behaviour is slightly
2867different from the original Korn shell which closes its copy of the write
2868portion of the co-process output when the most recently started co-process
2869(instead of when all sharing co-processes) exits.
2870.It
Elliott Hughes96b43632015-07-17 11:39:41 -07002871.Ic print Fl p
Geremy Condra03ebf062011-10-12 18:17:24 -07002872will ignore
2873.Dv SIGPIPE
2874signals during writes if the signal is not being trapped or ignored; the same
2875is true if the co-process input has been duplicated to another file descriptor
2876and
Elliott Hughes96b43632015-07-17 11:39:41 -07002877.Ic print Fl u Ns Ar n
Geremy Condra03ebf062011-10-12 18:17:24 -07002878is used.
2879.El
2880.Ss Functions
2881Functions are defined using either Korn shell
2882.Ic function Ar function-name
2883syntax or the Bourne/POSIX shell
2884.Ar function-name Ns \&()
2885syntax (see below for the difference between the two forms).
2886Functions are like
2887.Li .\(hyscripts
2888(i.e. scripts sourced using the
Elliott Hughes966dd552016-12-08 15:56:04 -08002889.Dq Li \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07002890built-in)
2891in that they are executed in the current environment.
2892However, unlike
2893.Li .\(hyscripts ,
2894shell arguments (i.e. positional parameters $1, $2, etc.)\&
2895are never visible inside them.
2896When the shell is determining the location of a command, functions
Thorsten Glaser811a5752013-07-25 14:24:45 +00002897are searched after special built-in commands, before builtins and the
Geremy Condra03ebf062011-10-12 18:17:24 -07002898.Ev PATH
2899is searched.
2900.Pp
2901An existing function may be deleted using
2902.Ic unset Fl f Ar function-name .
2903A list of functions can be obtained using
2904.Ic typeset +f
2905and the function definitions can be listed using
Elliott Hughes96b43632015-07-17 11:39:41 -07002906.Ic typeset Fl f .
Geremy Condra03ebf062011-10-12 18:17:24 -07002907The
2908.Ic autoload
2909command (which is an alias for
Elliott Hughes96b43632015-07-17 11:39:41 -07002910.Ic typeset Fl fu )
Geremy Condra03ebf062011-10-12 18:17:24 -07002911may be used to create undefined functions: when an undefined function is
2912executed, the shell searches the path specified in the
2913.Ev FPATH
2914parameter for a file with the same name as the function which, if found, is
2915read and executed.
2916If after executing the file the named function is found to
2917be defined, the function is executed; otherwise, the normal command search is
2918continued (i.e. the shell searches the regular built-in command table and
2919.Ev PATH ) .
2920Note that if a command is not found using
2921.Ev PATH ,
2922an attempt is made to autoload a function using
2923.Ev FPATH
2924(this is an undocumented feature of the original Korn shell).
2925.Pp
2926Functions can have two attributes,
2927.Dq trace
2928and
2929.Dq export ,
2930which can be set with
Elliott Hughes96b43632015-07-17 11:39:41 -07002931.Ic typeset Fl ft
Geremy Condra03ebf062011-10-12 18:17:24 -07002932and
Elliott Hughes96b43632015-07-17 11:39:41 -07002933.Ic typeset Fl fx ,
Geremy Condra03ebf062011-10-12 18:17:24 -07002934respectively.
2935When a traced function is executed, the shell's
2936.Ic xtrace
2937option is turned on for the function's duration.
2938The
2939.Dq export
2940attribute of functions is currently not used.
Geremy Condra03ebf062011-10-12 18:17:24 -07002941.Pp
2942Since functions are executed in the current shell environment, parameter
2943assignments made inside functions are visible after the function completes.
2944If this is not the desired effect, the
2945.Ic typeset
2946command can be used inside a function to create a local parameter.
2947Note that
2948.At
2949.Nm ksh93
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002950uses static scoping (one global scope, one local scope per function)
2951and allows local variables only on Korn style functions, whereas
Geremy Condra03ebf062011-10-12 18:17:24 -07002952.Nm mksh
2953uses dynamic scoping (nested scopes of varying locality).
2954Note that special parameters (e.g.\&
2955.Ic \&$$ , $! )
2956can't be scoped in this way.
2957.Pp
2958The exit status of a function is that of the last command executed in the
2959function.
2960A function can be made to finish immediately using the
2961.Ic return
2962command; this may also be used to explicitly specify the exit status.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07002963Note that when called in a subshell,
2964.Ic return
2965will only exit that subshell and will not cause the original shell to exit
2966a running function (see the
2967.Ic while Ns Li \&... Ns Ic read
2968loop FAQ below).
Geremy Condra03ebf062011-10-12 18:17:24 -07002969.Pp
2970Functions defined with the
2971.Ic function
2972reserved word are treated differently in the following ways from functions
2973defined with the
2974.Ic \&()
2975notation:
2976.Bl -bullet
2977.It
2978The $0 parameter is set to the name of the function
2979(Bourne-style functions leave $0 untouched).
2980.It
2981Parameter assignments preceding function calls are not kept in the shell
2982environment (executing Bourne-style functions will keep assignments).
2983.It
2984.Ev OPTIND
2985is saved/reset and restored on entry and exit from the function so
2986.Ic getopts
2987can be used properly both inside and outside the function (Bourne-style
2988functions leave
2989.Ev OPTIND
2990untouched, so using
2991.Ic getopts
2992inside a function interferes with using
2993.Ic getopts
2994outside the function).
2995.It
Elliott Hughes96b43632015-07-17 11:39:41 -07002996Shell options
2997.Pq Ic set Fl o
2998have local scope, i.e. changes inside a function are reset upon its exit.
Geremy Condra03ebf062011-10-12 18:17:24 -07002999.El
3000.Pp
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00003001In the future, the following differences may also be added:
Geremy Condra03ebf062011-10-12 18:17:24 -07003002.Bl -bullet
3003.It
3004A separate trap/signal environment will be used during the execution of
3005functions.
3006This will mean that traps set inside a function will not affect the
3007shell's traps and signals that are not ignored in the shell (but may be
3008trapped) will have their default effect in a function.
3009.It
3010The EXIT trap, if set in a function, will be executed after the function
3011returns.
3012.El
3013.Ss Command execution
Elliott Hughes966dd552016-12-08 15:56:04 -08003014After evaluation of command-line arguments, redirections and parameter
Thorsten Glaser811a5752013-07-25 14:24:45 +00003015assignments, the type of command is determined: a special built-in command,
Elliott Hughes966dd552016-12-08 15:56:04 -08003016a function, a normal builtin or the name of a file to execute found using the
Geremy Condra03ebf062011-10-12 18:17:24 -07003017.Ev PATH
3018parameter.
3019The checks are made in the above order.
3020Special built-in commands differ from other commands in that the
3021.Ev PATH
3022parameter is not used to find them, an error during their execution can
3023cause a non-interactive shell to exit, and parameter assignments that are
3024specified before the command are kept after the command completes.
3025Regular built-in commands are different only in that the
3026.Ev PATH
3027parameter is not used to find them.
3028.Pp
3029The original
3030.Nm ksh
3031and POSIX differ somewhat in which commands are considered
Thorsten Glaser811a5752013-07-25 14:24:45 +00003032special or regular.
Geremy Condra03ebf062011-10-12 18:17:24 -07003033.Pp
Thorsten Glaser811a5752013-07-25 14:24:45 +00003034POSIX special built-in utilities:
Geremy Condra03ebf062011-10-12 18:17:24 -07003035.Pp
3036.Ic \&. , \&: , break , continue ,
3037.Ic eval , exec , exit , export ,
3038.Ic readonly , return , set , shift ,
Thorsten Glaser811a5752013-07-25 14:24:45 +00003039.Ic times , trap , unset
Geremy Condra03ebf062011-10-12 18:17:24 -07003040.Pp
3041Additional
3042.Nm
Thorsten Glaser811a5752013-07-25 14:24:45 +00003043commands keeping assignments:
Geremy Condra03ebf062011-10-12 18:17:24 -07003044.Pp
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003045.Ic global , source , typeset
Geremy Condra03ebf062011-10-12 18:17:24 -07003046.Pp
Thorsten Glaser811a5752013-07-25 14:24:45 +00003047Builtins that are not special:
Geremy Condra03ebf062011-10-12 18:17:24 -07003048.Pp
Thorsten Glaser811a5752013-07-25 14:24:45 +00003049.Ic [ , alias , bg , bind ,
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003050.Ic builtin , cat , cd , command ,
3051.Ic echo , false , fc , fg ,
3052.Ic getopts , jobs , kill , let ,
3053.Ic print , pwd , read , realpath ,
3054.Ic rename , sleep , suspend , test ,
3055.Ic true , ulimit , umask , unalias ,
3056.Ic wait , whence
Geremy Condra03ebf062011-10-12 18:17:24 -07003057.Pp
3058Once the type of command has been determined, any command-line parameter
3059assignments are performed and exported for the duration of the command.
3060.Pp
Elliott Hughesfc0307d2016-02-02 15:26:47 -08003061The following describes the special and regular built-in commands and
3062builtin-like reserved words:
Geremy Condra03ebf062011-10-12 18:17:24 -07003063.Pp
3064.Bl -tag -width false -compact
3065.It Ic \&. Ar file Op Ar arg ...
3066This is called the
3067.Dq dot
3068command.
3069Execute the commands in
3070.Ar file
3071in the current environment.
3072The file is searched for in the directories of
3073.Ev PATH .
3074If arguments are given, the positional parameters may be used to access them
3075while
3076.Ar file
3077is being executed.
3078If no arguments are given, the positional parameters are
3079those of the environment the command is used in.
3080.Pp
3081.It Ic \&: Op Ar ...
3082The null command.
3083Exit status is set to zero.
3084.Pp
Thorsten Glaser811a5752013-07-25 14:24:45 +00003085.It Ic \&[ Ar expression Ic \&]
3086See
3087.Ic test .
3088.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07003089.It Xo Ic alias
3090.Oo Fl d \*(Ba t Oo Fl r Oc \*(Ba
3091.Cm +\-x Oc
3092.Op Fl p
3093.Op Cm +
3094.Oo Ar name
3095.Op Ns = Ns Ar value
3096.Ar ... Oc
3097.Xc
3098Without arguments,
3099.Ic alias
3100lists all aliases.
3101For any name without a value, the existing alias is listed.
Elliott Hughes23925bb2017-09-22 16:04:20 -07003102Any name with a value defines an alias; see
Geremy Condra03ebf062011-10-12 18:17:24 -07003103.Sx Aliases
Elliott Hughes23925bb2017-09-22 16:04:20 -07003104above.
3105.Li \&[][A\-Za\-z0\-9_!%,.@:\-]
3106are valid in names, except they may not begin with a hyphen-minus, and
3107.Ic \&[[
3108is not a valid alias name.
Geremy Condra03ebf062011-10-12 18:17:24 -07003109.Pp
3110When listing aliases, one of two formats is used.
3111Normally, aliases are listed as
3112.Ar name Ns = Ns Ar value ,
3113where
3114.Ar value
3115is quoted.
3116If options were preceded with
3117.Ql + ,
3118or a lone
3119.Ql +
3120is given on the command line, only
3121.Ar name
3122is printed.
3123.Pp
3124The
3125.Fl d
3126option causes directory aliases which are used in tilde expansion to be
3127listed or set (see
3128.Sx Tilde expansion
3129above).
3130.Pp
3131If the
3132.Fl p
3133option is used, each alias is prefixed with the string
Elliott Hughes966dd552016-12-08 15:56:04 -08003134.Dq Li alias\ \& .
Geremy Condra03ebf062011-10-12 18:17:24 -07003135.Pp
3136The
3137.Fl t
3138option indicates that tracked aliases are to be listed/set (values specified on
3139the command line are ignored for tracked aliases).
3140The
3141.Fl r
3142option indicates that all tracked aliases are to be reset.
3143.Pp
3144The
3145.Fl x
3146option sets
3147.Pq Ic +x No clears
3148the export attribute of an alias, or, if no names are given, lists the aliases
3149with the export attribute (exporting an alias has no effect).
3150.Pp
3151.It Ic bg Op Ar job ...
3152Resume the specified stopped job(s) in the background.
3153If no jobs are specified,
3154.Ic %+
3155is assumed.
3156See
3157.Sx Job control
3158below for more information.
3159.Pp
3160.It Ic bind Op Fl l
3161The current bindings are listed.
3162If the
3163.Fl l
3164flag is given,
3165.Ic bind
3166instead lists the names of the functions to which keys may be bound.
3167See
3168.Sx Emacs editing mode
3169for more information.
3170.Pp
3171.It Xo Ic bind Op Fl m
3172.Ar string Ns = Ns Op Ar substitute
3173.Ar ...
3174.Xc
3175.It Xo Ic bind
3176.Ar string Ns = Ns Op Ar editing-command
3177.Ar ...
3178.Xc
3179The specified editing command is bound to the given
3180.Ar string ,
3181which should consist of a control character
3182optionally preceded by one of the two prefix characters
Elliott Hughes77740fc2016-08-12 15:06:53 -07003183and optionally succeeded by a tilde character.
Geremy Condra03ebf062011-10-12 18:17:24 -07003184Future input of the
3185.Ar string
3186will cause the editing command to be immediately invoked.
3187If the
3188.Fl m
3189flag is given, the specified input
3190.Ar string
3191will afterwards be immediately replaced by the given
3192.Ar substitute
3193string which may contain editing commands but not other macros.
3194If a tilde postfix is given, a tilde trailing the one or
3195two prefices and the control character is ignored, any
3196other trailing character will be processed afterwards.
3197.Pp
3198Control characters may be written using caret notation
3199i.e. \*(haX represents Ctrl-X.
Elliott Hughes23925bb2017-09-22 16:04:20 -07003200The caret itself can be escaped by a backslash, which also escapes itself.
3201Note that although only three prefix characters (usually ESC, \*(haX and NUL)
Geremy Condra03ebf062011-10-12 18:17:24 -07003202are supported, some multi-character sequences can be supported.
3203.Pp
3204The following default bindings show how the arrow keys, the home, end and
3205delete key on a BSD wsvt25, xterm\-xfree86 or GNU screen terminal are bound
3206(of course some escape sequences won't work out quite this nicely):
3207.Bd -literal -offset indent
3208bind \*(aq\*(haX\*(aq=prefix\-2
3209bind \*(aq\*(ha[[\*(aq=prefix\-2
3210bind \*(aq\*(haXA\*(aq=up\-history
3211bind \*(aq\*(haXB\*(aq=down\-history
3212bind \*(aq\*(haXC\*(aq=forward\-char
3213bind \*(aq\*(haXD\*(aq=backward\-char
3214bind \*(aq\*(haX1\*(TI\*(aq=beginning\-of\-line
3215bind \*(aq\*(haX7\*(TI\*(aq=beginning\-of\-line
3216bind \*(aq\*(haXH\*(aq=beginning\-of\-line
3217bind \*(aq\*(haX4\*(TI\*(aq=end\-of\-line
3218bind \*(aq\*(haX8\*(TI\*(aq=end\-of\-line
3219bind \*(aq\*(haXF\*(aq=end\-of\-line
3220bind \*(aq\*(haX3\*(TI\*(aq=delete\-char\-forward
3221.Ed
3222.Pp
3223.It Ic break Op Ar level
3224Exit the
3225.Ar level Ns th
3226inner-most
3227.Ic for ,
3228.Ic select ,
Elliott Hughes966dd552016-12-08 15:56:04 -08003229.Ic until
Geremy Condra03ebf062011-10-12 18:17:24 -07003230or
3231.Ic while
3232loop.
3233.Ar level
3234defaults to 1.
3235.Pp
3236.It Xo
3237.Ic builtin
3238.Op Fl \-
3239.Ar command Op Ar arg ...
3240.Xc
3241Execute the built-in command
3242.Ar command .
3243.Pp
3244.It Xo
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003245.Ic \ebuiltin
3246.Ar command Op Ar arg ...
3247.Xc
3248Same as
3249.Ic builtin .
3250Additionally acts as declaration utility forwarder, i.e. this is a
3251declaration utility (see
3252.Sx Tilde expansion )
3253.No iff Ar command
3254is a declaration utility.
3255.Pp
3256.It Xo
Geremy Condra03ebf062011-10-12 18:17:24 -07003257.Ic cat
3258.Op Fl u
3259.Op Ar
3260.Xc
3261Read files sequentially, in command line order, and write them to
3262standard output.
3263If a
3264.Ar file
3265is a single dash
Elliott Hughes966dd552016-12-08 15:56:04 -08003266.Pq Dq Li \-
Geremy Condra03ebf062011-10-12 18:17:24 -07003267or absent, read from standard input.
Geremy Condra03ebf062011-10-12 18:17:24 -07003268For direct builtin calls, the
3269.Tn POSIX
3270.Fl u
3271option is supported as a no-op.
Elliott Hughes96b43632015-07-17 11:39:41 -07003272For calls from shell, if any options are given, an external
3273.Xr cat 1
3274utility is preferred over the builtin.
Geremy Condra03ebf062011-10-12 18:17:24 -07003275.Pp
3276.It Xo
3277.Ic cd
3278.Op Fl L
3279.Op Ar dir
3280.Xc
3281.It Xo
3282.Ic cd
3283.Fl P Op Fl e
3284.Op Ar dir
3285.Xc
3286.It Xo
3287.Ic chdir
3288.Op Fl eLP
3289.Op Ar dir
3290.Xc
3291Set the working directory to
3292.Ar dir .
3293If the parameter
3294.Ev CDPATH
3295is set, it lists the search path for the directory containing
3296.Ar dir .
Elliott Hughes966dd552016-12-08 15:56:04 -08003297An unset or empty path means the current directory.
Geremy Condra03ebf062011-10-12 18:17:24 -07003298If
3299.Ar dir
3300is found in any component of the
3301.Ev CDPATH
Elliott Hughes966dd552016-12-08 15:56:04 -08003302search path other than an unset or empty path,
3303the name of the new working directory will be written to standard output.
Geremy Condra03ebf062011-10-12 18:17:24 -07003304If
3305.Ar dir
3306is missing, the home directory
3307.Ev HOME
3308is used.
3309If
3310.Ar dir
3311is
Elliott Hughes966dd552016-12-08 15:56:04 -08003312.Dq Li \- ,
Geremy Condra03ebf062011-10-12 18:17:24 -07003313the previous working directory is used (see the
3314.Ev OLDPWD
3315parameter).
3316.Pp
3317If the
3318.Fl L
3319option (logical path) is used or if the
3320.Ic physical
3321option isn't set (see the
3322.Ic set
3323command below), references to
Elliott Hughes966dd552016-12-08 15:56:04 -08003324.Dq Li ..
Geremy Condra03ebf062011-10-12 18:17:24 -07003325in
3326.Ar dir
3327are relative to the path used to get to the directory.
3328If the
3329.Fl P
3330option (physical path) is used or if the
3331.Ic physical
3332option is set,
Elliott Hughes966dd552016-12-08 15:56:04 -08003333.Dq Li ..
Geremy Condra03ebf062011-10-12 18:17:24 -07003334is relative to the filesystem directory tree.
3335The
3336.Ev PWD
3337and
3338.Ev OLDPWD
3339parameters are updated to reflect the current and old working directory,
3340respectively.
3341If the
3342.Fl e
Elliott Hughes966dd552016-12-08 15:56:04 -08003343option is set for physical filesystem traversal and
Geremy Condra03ebf062011-10-12 18:17:24 -07003344.Ev PWD
3345could not be set, the exit code is 1; greater than 1 if an
3346error occurred, 0 otherwise.
3347.Pp
3348.It Xo
3349.Ic cd
3350.Op Fl eLP
3351.Ar old new
3352.Xc
3353.It Xo
3354.Ic chdir
3355.Op Fl eLP
3356.Ar old new
3357.Xc
3358The string
3359.Ar new
3360is substituted for
3361.Ar old
3362in the current directory, and the shell attempts to change to the new
3363directory.
3364.Pp
3365.It Xo
3366.Ic command
3367.Op Fl pVv
3368.Ar cmd
3369.Op Ar arg ...
3370.Xc
3371If neither the
3372.Fl v
3373nor
3374.Fl V
3375option is given,
3376.Ar cmd
3377is executed exactly as if
3378.Ic command
3379had not been specified, with two exceptions:
3380firstly,
3381.Ar cmd
3382cannot be a shell function;
3383and secondly, special built-in commands lose their specialness
3384(i.e. redirection and utility errors do not cause the shell to
3385exit, and command assignments are not permanent).
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003386The declaration utility property is not reset.
Geremy Condra03ebf062011-10-12 18:17:24 -07003387.Pp
3388If the
3389.Fl p
3390option is given, a default search path is used instead of the current value of
3391.Ev PATH ,
3392the actual value of which is system dependent.
3393.Pp
3394If the
3395.Fl v
3396option is given, instead of executing
3397.Ar cmd ,
3398information about what would be executed is given (and the same is done for
3399.Ar arg ... ) .
Elliott Hughes96b43632015-07-17 11:39:41 -07003400For builtins, functions and keywords, their names are simply printed;
3401for aliases, a command that defines them is printed;
3402for utilities found by searching the
Geremy Condra03ebf062011-10-12 18:17:24 -07003403.Ev PATH
3404parameter, the full path of the command is printed.
3405If no command is found
3406(i.e. the path search fails), nothing is printed and
3407.Ic command
3408exits with a non-zero status.
3409The
3410.Fl V
3411option is like the
3412.Fl v
3413option, except it is more verbose.
3414.Pp
3415.It Ic continue Op Ar level
3416Jumps to the beginning of the
3417.Ar level Ns th
3418inner-most
3419.Ic for ,
3420.Ic select ,
Elliott Hughes966dd552016-12-08 15:56:04 -08003421.Ic until
Geremy Condra03ebf062011-10-12 18:17:24 -07003422or
3423.Ic while
3424loop.
3425.Ar level
3426defaults to 1.
3427.Pp
3428.It Xo
3429.Ic echo
3430.Op Fl Een
3431.Op Ar arg ...
3432.Xc
3433.Em Warning:
3434this utility is not portable; use the Korn shell builtin
3435.Ic print
Geremy Condra03ebf062011-10-12 18:17:24 -07003436instead.
3437.Pp
3438Prints its arguments (separated by spaces) followed by a newline, to the
3439standard output.
3440The newline is suppressed if any of the arguments contain the
3441backslash sequence
Elliott Hughes966dd552016-12-08 15:56:04 -08003442.Dq Li \ec .
Geremy Condra03ebf062011-10-12 18:17:24 -07003443See the
3444.Ic print
3445command below for a list of other backslash sequences that are recognised.
3446.Pp
3447The options are provided for compatibility with
3448.Bx
3449shell scripts.
3450The
3451.Fl n
3452option suppresses the trailing newline,
3453.Fl e
3454enables backslash interpretation (a no-op, since this is normally done), and
3455.Fl E
3456suppresses backslash interpretation.
3457.Pp
3458If the
3459.Ic posix
3460or
3461.Ic sh
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003462option is set or this is a direct builtin call or
3463.Ic print
3464.Fl R ,
3465only the first argument is treated as an option, and only if it is exactly
Elliott Hughes966dd552016-12-08 15:56:04 -08003466.Dq Li \-n .
Geremy Condra03ebf062011-10-12 18:17:24 -07003467Backslash interpretation is disabled.
3468.Pp
3469.It Ic eval Ar command ...
3470The arguments are concatenated (with spaces between them) to form a single
3471string which the shell then parses and executes in the current environment.
3472.Pp
3473.It Xo
3474.Ic exec
Elliott Hughes50012062015-03-10 22:22:24 -07003475.Op Fl a Ar argv0
3476.Op Fl c
Geremy Condra03ebf062011-10-12 18:17:24 -07003477.Op Ar command Op Ar arg ...
3478.Xc
3479The command is executed without forking, replacing the shell process.
Elliott Hughes50012062015-03-10 22:22:24 -07003480This is currently absolute, i.e.\&
3481.Ic exec
3482never returns, even if the
3483.Ar command
3484is not found.
3485The
3486.Fl a
3487option permits setting a different
3488.Li argv[0]
3489value, and
3490.Fl c
3491clears the environment before executing the child process, except for the
3492.Ev _
3493variable and direct assignments.
Geremy Condra03ebf062011-10-12 18:17:24 -07003494.Pp
3495If no command is given except for I/O redirection, the I/O redirection is
3496permanent and the shell is
3497not replaced.
3498Any file descriptors greater than 2 which are opened or
3499.Xr dup 2 Ns 'd
3500in this way are not made available to other executed commands (i.e. commands
3501that are not built-in to the shell).
3502Note that the Bourne shell differs here;
3503it does pass these file descriptors on.
3504.Pp
3505.It Ic exit Op Ar status
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003506The shell or subshell exits with the specified exit status.
Geremy Condra03ebf062011-10-12 18:17:24 -07003507If
3508.Ar status
3509is not specified, the exit status is the current value of the
Elliott Hughes966dd552016-12-08 15:56:04 -08003510.Ic \&$?
Geremy Condra03ebf062011-10-12 18:17:24 -07003511parameter.
3512.Pp
3513.It Xo
3514.Ic export
3515.Op Fl p
3516.Op Ar parameter Ns Op = Ns Ar value
3517.Xc
3518Sets the export attribute of the named parameters.
3519Exported parameters are passed in the environment to executed commands.
3520If values are specified, the named parameters are also assigned.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003521This is a declaration utility.
Geremy Condra03ebf062011-10-12 18:17:24 -07003522.Pp
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00003523If no parameters are specified, all parameters with the export attribute
3524set are printed one per line; either their names, or, if a
Elliott Hughes966dd552016-12-08 15:56:04 -08003525.Dq Li \-
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00003526with no option letter is specified, name=value pairs, or, with
3527.Fl p ,
Geremy Condra03ebf062011-10-12 18:17:24 -07003528.Ic export
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00003529commands suitable for re-entry.
Geremy Condra03ebf062011-10-12 18:17:24 -07003530.Pp
3531.It Ic false
3532A command that exits with a non-zero status.
3533.Pp
3534.It Xo
3535.Ic fc
3536.Oo Fl e Ar editor \*(Ba
3537.Fl l Op Fl n Oc
3538.Op Fl r
3539.Op Ar first Op Ar last
3540.Xc
3541.Ar first
3542and
3543.Ar last
3544select commands from the history.
3545Commands can be selected by history number
Elliott Hughes737fdce2014-08-07 12:59:26 -07003546(negative numbers go backwards from the current, most recent, line)
Geremy Condra03ebf062011-10-12 18:17:24 -07003547or a string specifying the most recent command starting with that string.
3548The
3549.Fl l
3550option lists the command on standard output, and
3551.Fl n
3552inhibits the default command numbers.
3553The
3554.Fl r
3555option reverses the order of the list.
3556Without
3557.Fl l ,
3558the selected commands are edited by the editor specified with the
3559.Fl e
Elliott Hughes966dd552016-12-08 15:56:04 -08003560option or, if no
Geremy Condra03ebf062011-10-12 18:17:24 -07003561.Fl e
3562is specified, the editor specified by the
3563.Ev FCEDIT
3564parameter (if this parameter is not set,
3565.Pa /bin/ed
3566is used), and then executed by the shell.
3567.Pp
3568.It Xo
3569.Ic fc
3570.Cm \-e \- \*(Ba Fl s
3571.Op Fl g
3572.Op Ar old Ns = Ns Ar new
3573.Op Ar prefix
3574.Xc
3575Re-execute the selected command (the previous command by default) after
3576performing the optional substitution of
3577.Ar old
3578with
3579.Ar new .
3580If
3581.Fl g
3582is specified, all occurrences of
3583.Ar old
3584are replaced with
3585.Ar new .
3586The meaning of
3587.Cm \-e \-
3588and
3589.Fl s
3590is identical: re-execute the selected command without invoking an editor.
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00003591This command is usually accessed with the predefined:
Geremy Condra03ebf062011-10-12 18:17:24 -07003592.Ic alias r=\*(aqfc \-e \-\*(aq
Geremy Condra03ebf062011-10-12 18:17:24 -07003593.Pp
3594.It Ic fg Op Ar job ...
3595Resume the specified job(s) in the foreground.
3596If no jobs are specified,
3597.Ic %+
3598is assumed.
3599See
3600.Sx Job control
3601below for more information.
3602.Pp
3603.It Xo
3604.Ic getopts
3605.Ar optstring name
3606.Op Ar arg ...
3607.Xc
3608Used by shell procedures to parse the specified arguments (or positional
3609parameters, if no arguments are given) and to check for legal options.
3610.Ar optstring
3611contains the option letters that
3612.Ic getopts
3613is to recognise.
3614If a letter is followed by a colon, the option is expected to
3615have an argument.
3616Options that do not take arguments may be grouped in a single argument.
3617If an option takes an argument and the option character is not the
3618last character of the argument it is found in, the remainder of the argument is
3619taken to be the option's argument; otherwise, the next argument is the option's
3620argument.
3621.Pp
3622Each time
3623.Ic getopts
3624is invoked, it places the next option in the shell parameter
3625.Ar name
3626and the index of the argument to be processed by the next call to
3627.Ic getopts
3628in the shell parameter
3629.Ev OPTIND .
3630If the option was introduced with a
3631.Ql + ,
3632the option placed in
3633.Ar name
3634is prefixed with a
3635.Ql + .
3636When an option requires an argument,
3637.Ic getopts
3638places it in the shell parameter
3639.Ev OPTARG .
3640.Pp
3641When an illegal option or a missing option argument is encountered, a question
3642mark or a colon is placed in
3643.Ar name
3644(indicating an illegal option or missing argument, respectively) and
3645.Ev OPTARG
3646is set to the option character that caused the problem.
3647Furthermore, if
3648.Ar optstring
3649does not begin with a colon, a question mark is placed in
3650.Ar name ,
3651.Ev OPTARG
3652is unset, and an error message is printed to standard error.
3653.Pp
3654When the end of the options is encountered,
3655.Ic getopts
3656exits with a non-zero exit status.
3657Options end at the first (non-option
3658argument) argument that does not start with a
3659.Ql \- ,
3660or when a
Elliott Hughes966dd552016-12-08 15:56:04 -08003661.Dq Li \-\-
Geremy Condra03ebf062011-10-12 18:17:24 -07003662argument is encountered.
3663.Pp
3664Option parsing can be reset by setting
3665.Ev OPTIND
3666to 1 (this is done automatically whenever the shell or a shell procedure is
3667invoked).
3668.Pp
3669Warning: Changing the value of the shell parameter
3670.Ev OPTIND
Elliott Hughes966dd552016-12-08 15:56:04 -08003671to a value other than 1 or parsing different sets of arguments without
Geremy Condra03ebf062011-10-12 18:17:24 -07003672resetting
Elliott Hughes966dd552016-12-08 15:56:04 -08003673.Ev OPTIND
Geremy Condra03ebf062011-10-12 18:17:24 -07003674may lead to unexpected results.
3675.Pp
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003676.It Xo
3677.Ic global
3678.Op Ic +\-aglpnrtUux
3679.Oo Fl L Ns Op Ar n
3680.No \*(Ba Fl R Ns Op Ar n
3681.No \*(Ba Fl Z Ns Op Ar n Oc
3682.Op Fl i Ns Op Ar n
3683.Oo Ar name
3684.Op Ns = Ns Ar value
3685.Ar ... Oc
3686.Xc
Thorsten Glaser811a5752013-07-25 14:24:45 +00003687See
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003688.Ic typeset Fl g .
3689.No Deprecated , Em will
3690be removed from a future version of
3691.Nm .
Thorsten Glaser811a5752013-07-25 14:24:45 +00003692.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07003693.It Xo
3694.Ic hash
3695.Op Fl r
3696.Op Ar name ...
3697.Xc
3698Without arguments, any hashed executable command pathnames are listed.
3699The
3700.Fl r
3701option causes all hashed commands to be removed from the hash table.
3702Each
3703.Ar name
3704is searched as if it were a command name and added to the hash table if it is
3705an executable command.
3706.Pp
3707.It Xo
3708.Ic jobs
3709.Op Fl lnp
3710.Op Ar job ...
3711.Xc
3712Display information about the specified job(s); if no jobs are specified, all
3713jobs are displayed.
3714The
3715.Fl n
3716option causes information to be displayed only for jobs that have changed
3717state since the last notification.
3718If the
3719.Fl l
3720option is used, the process ID of each process in a job is also listed.
3721The
3722.Fl p
3723option causes only the process group of each job to be printed.
3724See
3725.Sx Job control
3726below for the format of
3727.Ar job
3728and the displayed job.
3729.Pp
3730.It Xo
3731.Ic kill
3732.Oo Fl s Ar signame \*(Ba
3733.No \- Ns Ar signum \*(Ba
3734.No \- Ns Ar signame Oc
3735.No { Ar job \*(Ba pid \*(Ba pgrp No }
3736.Ar ...
3737.Xc
Elliott Hughes966dd552016-12-08 15:56:04 -08003738Send the specified signal to the specified jobs, process IDs or process
Geremy Condra03ebf062011-10-12 18:17:24 -07003739groups.
3740If no signal is specified, the
3741.Dv TERM
3742signal is sent.
3743If a job is specified, the signal is sent to the job's process group.
3744See
3745.Sx Job control
3746below for the format of
3747.Ar job .
3748.Pp
3749.It Xo
3750.Ic kill
3751.Fl l
3752.Op Ar exit-status ...
3753.Xc
3754Print the signal name corresponding to
3755.Ar exit-status .
Elliott Hughes966dd552016-12-08 15:56:04 -08003756If no arguments are specified, a list of all the signals with their numbers
3757and a short description of each are printed.
Geremy Condra03ebf062011-10-12 18:17:24 -07003758.Pp
3759.It Ic let Op Ar expression ...
3760Each expression is evaluated (see
3761.Sx Arithmetic expressions
3762above).
3763If all expressions are successfully evaluated, the exit status is 0 (1)
3764if the last expression evaluated to non-zero (zero).
3765If an error occurs during
3766the parsing or evaluation of an expression, the exit status is greater than 1.
3767Since expressions may need to be quoted,
3768.No \&(( Ar expr No ))
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003769is syntactic sugar for:
3770.Dl "{ \e\ebuiltin let \*(aq" Ns Ar expr Ns "\*(aq; }"
Thorsten Glaser811a5752013-07-25 14:24:45 +00003771.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07003772.It Xo
3773.Ic mknod
3774.Op Fl m Ar mode
3775.Ar name
3776.Cm b\*(Bac
3777.Ar major minor
3778.Xc
3779.It Xo
3780.Ic mknod
3781.Op Fl m Ar mode
3782.Ar name
3783.Cm p
3784.Xc
3785Create a device special file.
3786The file type may be
3787.Cm b
3788(block type device),
3789.Cm c
Elliott Hughes966dd552016-12-08 15:56:04 -08003790(character type device)
Geremy Condra03ebf062011-10-12 18:17:24 -07003791or
3792.Cm p
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00003793.Pq named pipe , Tn FIFO .
Geremy Condra03ebf062011-10-12 18:17:24 -07003794The file created may be modified according to its
3795.Ar mode
3796(via the
3797.Fl m
3798option),
3799.Ar major
3800(major device number),
3801and
3802.Ar minor
3803(minor device number).
Elliott Hughes96b43632015-07-17 11:39:41 -07003804This is not normally part of
3805.Nm mksh ;
3806however, distributors may have added this as builtin as a speed hack.
Geremy Condra03ebf062011-10-12 18:17:24 -07003807.Pp
3808.It Xo
3809.Ic print
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003810.Oo Fl AcelNnprsu Ns Oo Ar n Oc \*(Ba
3811.Fl R Op Fl n Oc
Geremy Condra03ebf062011-10-12 18:17:24 -07003812.Op Ar argument ...
3813.Xc
Elliott Hughes966dd552016-12-08 15:56:04 -08003814Print the specified argument(s) on the standard output,
3815separated by spaces, terminated with a newline.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003816The escapes mentioned in
Geremy Condra03ebf062011-10-12 18:17:24 -07003817.Sx Backslash expansion
3818above, as well as
Elliott Hughes966dd552016-12-08 15:56:04 -08003819.Dq Li \ec ,
Geremy Condra03ebf062011-10-12 18:17:24 -07003820which is equivalent to using the
3821.Fl n
Elliott Hughes966dd552016-12-08 15:56:04 -08003822option, are interpreted.
3823.Pp
3824The options are as follows:
3825.Bl -tag -width Ds
3826.It Fl A
3827Each
3828.Ar argument
3829is arithmetically evaluated; the character corresponding to the
3830resulting value is printed.
3831Empty
3832.Ar argument Ns s
3833separate input words.
3834.It Fl c
3835The output is printed columnised, line by line, similar to how the
3836.Xr rs 1
3837utility, tab completion, the
3838.Ic kill Fl l
3839built-in utility and the
3840.Ic select
3841statement do.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003842.It Fl e
3843Restore backslash expansion after a previous
3844.Fl r .
Elliott Hughes966dd552016-12-08 15:56:04 -08003845.It Fl l
3846Change the output word separator to newline.
3847.It Fl N
3848Change the output word and line separator to ASCII NUL.
3849.It Fl n
3850Do not print the trailing line separator.
3851.It Fl p
3852Print to the co-process (see
Geremy Condra03ebf062011-10-12 18:17:24 -07003853.Sx Co-processes
3854above).
Elliott Hughes966dd552016-12-08 15:56:04 -08003855.It Fl r
3856Inhibit backslash expansion.
3857.It Fl s
3858Print to the history file instead of standard output.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003859.It Fl u Ns Op Ar n
Elliott Hughes966dd552016-12-08 15:56:04 -08003860Print to the file descriptor
3861.Ar n Pq defaults to 1 if omitted
3862instead of standard output.
3863.El
Geremy Condra03ebf062011-10-12 18:17:24 -07003864.Pp
3865The
3866.Fl R
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003867option mostly emulates the
Geremy Condra03ebf062011-10-12 18:17:24 -07003868.Bx
3869.Xr echo 1
Elliott Hughesa3c3f962017-04-12 16:52:30 -07003870command which does not expand backslashes and interprets
3871its first argument as option only if it is exactly
3872.Dq Li \-n
3873.Pq to suppress the trailing newline .
Geremy Condra03ebf062011-10-12 18:17:24 -07003874.Pp
3875.It Ic pwd Op Fl LP
3876Print the present working directory.
3877If the
3878.Fl L
3879option is used or if the
3880.Ic physical
3881option isn't set (see the
3882.Ic set
3883command below), the logical path is printed (i.e. the path used to
3884.Ic cd
3885to the current directory).
3886If the
3887.Fl P
3888option (physical path) is used or if the
3889.Ic physical
3890option is set, the path determined from the filesystem (by following
Elliott Hughes966dd552016-12-08 15:56:04 -08003891.Dq Li ..
Geremy Condra03ebf062011-10-12 18:17:24 -07003892directories to the root directory) is printed.
3893.Pp
3894.It Xo
3895.Ic read
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00003896.Op Fl A \*(Ba Fl a
Geremy Condra03ebf062011-10-12 18:17:24 -07003897.Op Fl d Ar x
3898.Oo Fl N Ar z \*(Ba
3899.Fl n Ar z Oc
3900.Oo Fl p \*(Ba
3901.Fl u Ns Op Ar n
3902.Oc Op Fl t Ar n
3903.Op Fl rs
3904.Op Ar p ...
3905.Xc
3906Reads a line of input, separates the input into fields using the
3907.Ev IFS
3908parameter (see
3909.Sx Substitution
3910above), and assigns each field to the specified parameters
3911.Ar p .
3912If no parameters are specified, the
3913.Ev REPLY
3914parameter is used to store the result.
3915With the
3916.Fl A
3917and
3918.Fl a
3919options, only no or one parameter is accepted.
3920If there are more parameters than fields, the extra parameters are set to
3921the empty string or 0; if there are more fields than parameters, the last
3922parameter is assigned the remaining fields (including the word separators).
3923.Pp
3924The options are as follows:
3925.Bl -tag -width XuXnX
3926.It Fl A
3927Store the result into the parameter
3928.Ar p
3929(or
3930.Ev REPLY )
3931as array of words.
3932.It Fl a
3933Store the result without word splitting into the parameter
3934.Ar p
3935(or
3936.Ev REPLY )
3937as array of characters (wide characters if the
3938.Ic utf8\-mode
Elliott Hughesfc0307d2016-02-02 15:26:47 -08003939option is enacted, octets otherwise); the codepoints are
3940encoded as decimal numbers by default.
Geremy Condra03ebf062011-10-12 18:17:24 -07003941.It Fl d Ar x
3942Use the first byte of
3943.Ar x ,
3944.Dv NUL
3945if empty, instead of the ASCII newline character as input line delimiter.
3946.It Fl N Ar z
3947Instead of reading till end-of-line, read exactly
3948.Ar z
Elliott Hughes96b43632015-07-17 11:39:41 -07003949bytes.
Elliott Hughes966dd552016-12-08 15:56:04 -08003950Upon EOF, a partial read is returned with exit status 1.
3951After timeout, a partial read is returned with an exit status as if
3952.Dv SIGALRM
3953were caught.
Geremy Condra03ebf062011-10-12 18:17:24 -07003954.It Fl n Ar z
3955Instead of reading till end-of-line, read up to
3956.Ar z
3957bytes but return as soon as any bytes are read, e.g.\& from a
3958slow terminal device, or if EOF or a timeout occurs.
3959.It Fl p
3960Read from the currently active co-process, see
3961.Sx Co-processes
3962above for details on this.
3963.It Fl u Ns Op Ar n
3964Read from the file descriptor
3965.Ar n
3966(defaults to 0, i.e.\& standard input).
3967The argument must immediately follow the option character.
3968.It Fl t Ar n
3969Interrupt reading after
3970.Ar n
3971seconds (specified as positive decimal value with an optional fractional part).
Elliott Hughes96b43632015-07-17 11:39:41 -07003972The exit status of
3973.Nm read
Elliott Hughes966dd552016-12-08 15:56:04 -08003974is the same as if
3975.Dv SIGALRM
3976were caught if the timeout occurred, but partial reads may still be returned.
Geremy Condra03ebf062011-10-12 18:17:24 -07003977.It Fl r
3978Normally, the ASCII backslash character escapes the special
3979meaning of the following character and is stripped from the input;
3980.Ic read
3981does not stop when encountering a backslash-newline sequence and
3982does not store that newline in the result.
3983This option enables raw mode, in which backslashes are not processed.
3984.It Fl s
3985The input line is saved to the history.
3986.El
3987.Pp
3988If the input is a terminal, both the
3989.Fl N
3990and
3991.Fl n
3992options set it into raw mode;
3993they read an entire file if \-1 is passed as
3994.Ar z
3995argument.
3996.Pp
3997The first parameter may have a question mark and a string appended to it, in
3998which case the string is used as a prompt (printed to standard error before
3999any input is read) if the input is a
4000.Xr tty 4
4001(e.g.\&
4002.Ic read nfoo?\*(aqnumber of foos: \*(aq ) .
4003.Pp
4004If no input is read or a timeout occurred,
4005.Ic read
4006exits with a non-zero status.
4007.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07004008.It Xo
4009.Ic readonly
4010.Op Fl p
4011.Oo Ar parameter
4012.Op Ns = Ns Ar value
4013.Ar ... Oc
4014.Xc
4015Sets the read-only attribute of the named parameters.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07004016This is a declaration utility.
Geremy Condra03ebf062011-10-12 18:17:24 -07004017If values are given,
4018parameters are set to them before setting the attribute.
4019Once a parameter is
4020made read-only, it cannot be unset and its value cannot be changed.
4021.Pp
4022If no parameters are specified, the names of all parameters with the read-only
4023attribute are printed one per line, unless the
4024.Fl p
4025option is used, in which case
4026.Ic readonly
4027commands defining all read-only parameters, including their values, are
4028printed.
4029.Pp
4030.It Xo
4031.Ic realpath
4032.Op Fl \-
4033.Ar name
4034.Xc
4035Prints the resolved absolute pathname corresponding to
4036.Ar name .
4037If
4038.Ar name
4039ends with a slash
Elliott Hughes966dd552016-12-08 15:56:04 -08004040.Pq Ql / ,
Geremy Condra03ebf062011-10-12 18:17:24 -07004041it's also checked for existence and whether it is a directory; otherwise,
4042.Ic realpath
4043returns 0 if the pathname either exists or can be created immediately,
4044i.e. all but the last component exist and are directories.
Elliott Hughes77740fc2016-08-12 15:06:53 -07004045For calls from the shell, if any options are given, an external
4046.Xr realpath 1
4047utility is preferred over the builtin.
Geremy Condra03ebf062011-10-12 18:17:24 -07004048.Pp
4049.It Xo
4050.Ic rename
4051.Op Fl \-
4052.Ar from to
4053.Xc
4054Renames the file
4055.Ar from
4056to
4057.Ar to .
4058Both must be complete pathnames and on the same device.
Elliott Hughes77740fc2016-08-12 15:06:53 -07004059An external utility is preferred over this builtin,
4060which is intended for emergency situations
4061.Pq where Pa /bin/mv No becomes unusable
4062and directly calls
Geremy Condra03ebf062011-10-12 18:17:24 -07004063.Xr rename 2 .
4064.Pp
4065.It Ic return Op Ar status
4066Returns from a function or
Elliott Hughes77740fc2016-08-12 15:06:53 -07004067.Ic \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07004068script, with exit status
4069.Ar status .
4070If no
4071.Ar status
4072is given, the exit status of the last executed command is used.
4073If used outside of a function or
Elliott Hughes77740fc2016-08-12 15:06:53 -07004074.Ic \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07004075script, it has the same effect as
4076.Ic exit .
4077Note that
4078.Nm
4079treats both profile and
4080.Ev ENV
4081files as
Elliott Hughes77740fc2016-08-12 15:06:53 -07004082.Ic \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07004083scripts, while the original Korn shell only treats profiles as
Elliott Hughes77740fc2016-08-12 15:06:53 -07004084.Ic \&.
Geremy Condra03ebf062011-10-12 18:17:24 -07004085scripts.
4086.Pp
4087.It Xo
4088.Ic set Op Ic +\-abCefhiklmnprsUuvXx
4089.Op Ic +\-o Ar option
4090.Op Ic +\-A Ar name
4091.Op Fl \-
4092.Op Ar arg ...
4093.Xc
4094The
4095.Ic set
4096command can be used to set
4097.Pq Ic \-
4098or clear
4099.Pq Ic +
4100shell options, set the positional parameters, or set an array parameter.
4101Options can be changed using the
4102.Cm +\-o Ar option
4103syntax, where
4104.Ar option
4105is the long name of an option, or using the
4106.Cm +\- Ns Ar letter
4107syntax, where
4108.Ar letter
4109is the option's single letter name (not all options have a single letter name).
4110The following table lists both option letters (if they exist) and long names
4111along with a description of what the option does:
4112.Bl -tag -width 3n
4113.It Fl A Ar name
4114Sets the elements of the array parameter
4115.Ar name
4116to
4117.Ar arg ...
4118If
4119.Fl A
4120is used, the array is reset (i.e. emptied) first; if
4121.Ic +A
4122is used, the first N elements are set (where N is the number of arguments);
4123the rest are left untouched.
4124.Pp
4125An alternative syntax for the command
4126.Ic set \-A foo \-\- a b c
4127which is compatible to
4128.Tn GNU
4129.Nm bash
4130and also supported by
4131.At
4132.Nm ksh93
4133is:
4134.Ic foo=(a b c); foo+=(d e)
Geremy Condra03ebf062011-10-12 18:17:24 -07004135.It Fl a \*(Ba Fl o Ic allexport
4136All new parameters are created with the export attribute.
4137.It Fl b \*(Ba Fl o Ic notify
4138Print job notification messages asynchronously, instead of just before the
4139prompt.
4140Only used if job control is enabled
4141.Pq Fl m .
4142.It Fl C \*(Ba Fl o Ic noclobber
4143Prevent \*(Gt redirection from overwriting existing files.
4144Instead, \*(Gt\*(Ba must be used to force an overwrite.
Elliott Hughes737fdce2014-08-07 12:59:26 -07004145Note that this is not safe to use for creation of temporary files or
4146lockfiles due to a TOCTOU in a check allowing one to redirect output to
4147.Pa /dev/null
4148or other device files even in
4149.Ic noclobber
4150mode.
Geremy Condra03ebf062011-10-12 18:17:24 -07004151.It Fl e \*(Ba Fl o Ic errexit
4152Exit (after executing the
4153.Dv ERR
4154trap) as soon as an error occurs or a command fails (i.e. exits with a
4155non-zero status).
4156This does not apply to commands whose exit status is
4157explicitly tested by a shell construct such as
4158.Ic if ,
4159.Ic until ,
Elliott Hughes966dd552016-12-08 15:56:04 -08004160.Ic while
Geremy Condra03ebf062011-10-12 18:17:24 -07004161or
Elliott Hughes77740fc2016-08-12 15:06:53 -07004162.Ic \&!
Geremy Condra03ebf062011-10-12 18:17:24 -07004163statements.
Thorsten Glaser811a5752013-07-25 14:24:45 +00004164For
4165.Ic &&
4166or
4167.Ic \*(Ba\*(Ba ,
4168only the status of the last command is tested.
Geremy Condra03ebf062011-10-12 18:17:24 -07004169.It Fl f \*(Ba Fl o Ic noglob
4170Do not expand file name patterns.
4171.It Fl h \*(Ba Fl o Ic trackall
4172Create tracked aliases for all executed commands (see
4173.Sx Aliases
4174above).
4175Enabled by default for non-interactive shells.
4176.It Fl i \*(Ba Fl o Ic interactive
4177The shell is an interactive shell.
4178This option can only be used when the shell is invoked.
4179See above for a description of what this means.
4180.It Fl k \*(Ba Fl o Ic keyword
4181Parameter assignments are recognised anywhere in a command.
4182.It Fl l \*(Ba Fl o Ic login
4183The shell is a login shell.
4184This option can only be used when the shell is invoked.
4185See above for a description of what this means.
4186.It Fl m \*(Ba Fl o Ic monitor
4187Enable job control (default for interactive shells).
4188.It Fl n \*(Ba Fl o Ic noexec
4189Do not execute any commands.
4190Useful for checking the syntax of scripts
4191(ignored if interactive).
4192.It Fl p \*(Ba Fl o Ic privileged
4193The shell is a privileged shell.
4194It is set automatically if, when the shell starts,
4195the real UID or GID does not match
4196the effective UID (EUID) or GID (EGID), respectively.
4197See above for a description of what this means.
4198.It Fl r \*(Ba Fl o Ic restricted
4199The shell is a restricted shell.
4200This option can only be used when the shell is invoked.
4201See above for a description of what this means.
4202.It Fl s \*(Ba Fl o Ic stdin
4203If used when the shell is invoked, commands are read from standard input.
4204Set automatically if the shell is invoked with no arguments.
4205.Pp
4206When
4207.Fl s
4208is used with the
4209.Ic set
4210command it causes the specified arguments to be sorted before assigning them to
4211the positional parameters (or to array
4212.Ar name ,
4213if
4214.Fl A
4215is used).
4216.It Fl U \*(Ba Fl o Ic utf8\-mode
4217Enable UTF-8 support in the
4218.Sx Emacs editing mode
4219and internal string handling functions.
4220This flag is disabled by default, but can be enabled by setting it on the
4221shell command line; is enabled automatically for interactive shells if
4222requested at compile time, your system supports
4223.Fn setlocale LC_CTYPE \&""
4224and optionally
4225.Fn nl_langinfo CODESET ,
4226or the
4227.Ev LC_ALL ,
Elliott Hughes966dd552016-12-08 15:56:04 -08004228.Ev LC_CTYPE
Geremy Condra03ebf062011-10-12 18:17:24 -07004229or
4230.Ev LANG
4231environment variables,
4232and at least one of these returns something that matches
4233.Dq UTF\-8
4234or
4235.Dq utf8
4236case-insensitively; for direct builtin calls depending on the
4237aforementioned environment variables; or for stdin or scripts,
4238if the input begins with a UTF-8 Byte Order Mark.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08004239.Pp
4240In near future, locale tracking will be implemented, which means that
4241.Ic set Fl +U
4242is changed whenever one of the
4243.Tn POSIX
4244locale-related environment variables changes.
Geremy Condra03ebf062011-10-12 18:17:24 -07004245.It Fl u \*(Ba Fl o Ic nounset
4246Referencing of an unset parameter, other than
Elliott Hughes966dd552016-12-08 15:56:04 -08004247.Dq Li $@
Geremy Condra03ebf062011-10-12 18:17:24 -07004248or
Elliott Hughes966dd552016-12-08 15:56:04 -08004249.Dq Li $* ,
Geremy Condra03ebf062011-10-12 18:17:24 -07004250is treated as an error, unless one of the
4251.Ql \- ,
Elliott Hughes966dd552016-12-08 15:56:04 -08004252.Ql +
Geremy Condra03ebf062011-10-12 18:17:24 -07004253or
4254.Ql =
4255modifiers is used.
4256.It Fl v \*(Ba Fl o Ic verbose
4257Write shell input to standard error as it is read.
4258.It Fl X \*(Ba Fl o Ic markdirs
4259Mark directories with a trailing
4260.Ql /
4261during file name generation.
4262.It Fl x \*(Ba Fl o Ic xtrace
Thorsten Glaser811a5752013-07-25 14:24:45 +00004263Print command trees when they are executed, preceded by
Geremy Condra03ebf062011-10-12 18:17:24 -07004264the value of
4265.Ev PS4 .
4266.It Fl o Ic bgnice
4267Background jobs are run with lower priority.
4268.It Fl o Ic braceexpand
4269Enable brace expansion (a.k.a. alternation).
4270This is enabled by default.
Geremy Condra03ebf062011-10-12 18:17:24 -07004271.It Fl o Ic emacs
4272Enable BRL emacs-like command-line editing (interactive shells only); see
4273.Sx Emacs editing mode .
4274.It Fl o Ic gmacs
4275Enable gmacs-like command-line editing (interactive shells only).
4276Currently identical to emacs editing except that transpose\-chars (\*(haT) acts
4277slightly differently.
4278.It Fl o Ic ignoreeof
4279The shell will not (easily) exit when end-of-file is read;
4280.Ic exit
4281must be used.
4282To avoid infinite loops, the shell will exit if
4283.Dv EOF
4284is read 13 times in a row.
Thorsten Glaser811a5752013-07-25 14:24:45 +00004285.It Fl o Ic inherit\-xtrace
4286Do not reset
4287.Fl o Ic xtrace
4288upon entering functions.
4289This is enabled by default.
Geremy Condra03ebf062011-10-12 18:17:24 -07004290.It Fl o Ic nohup
4291Do not kill running jobs with a
4292.Dv SIGHUP
4293signal when a login shell exits.
4294Currently set by default, but this may
4295change in the future to be compatible with
4296.At
4297.Nm ksh ,
4298which
4299doesn't have this option, but does send the
4300.Dv SIGHUP
4301signal.
4302.It Fl o Ic nolog
4303No effect.
4304In the original Korn shell, this prevents function definitions from
4305being stored in the history file.
4306.It Fl o Ic physical
4307Causes the
4308.Ic cd
4309and
4310.Ic pwd
4311commands to use
4312.Dq physical
4313(i.e. the filesystem's)
Elliott Hughes966dd552016-12-08 15:56:04 -08004314.Dq Li ..
Geremy Condra03ebf062011-10-12 18:17:24 -07004315directories instead of
4316.Dq logical
4317directories (i.e. the shell handles
Elliott Hughes966dd552016-12-08 15:56:04 -08004318.Dq Li .. ,
Geremy Condra03ebf062011-10-12 18:17:24 -07004319which allows the user to be oblivious of symbolic links to directories).
4320Clear by default.
4321Note that setting this option does not affect the current value of the
4322.Ev PWD
4323parameter; only the
4324.Ic cd
4325command changes
4326.Ev PWD .
4327See the
4328.Ic cd
4329and
4330.Ic pwd
4331commands above for more details.
Thorsten Glaser811a5752013-07-25 14:24:45 +00004332.It Fl o Ic pipefail
4333Make the exit status of a pipeline (before logically complementing) the
4334rightmost non-zero errorlevel, or zero if all commands exited with zero.
Geremy Condra03ebf062011-10-12 18:17:24 -07004335.It Fl o Ic posix
Elliott Hughesfc0307d2016-02-02 15:26:47 -08004336Behave closer to the standards
4337(see
4338.Sx POSIX mode
4339for details).
4340Automatically enabled if the basename of the shell invocation begins with
4341.Dq sh
4342and this autodetection feature is compiled in
4343.Pq not in MirBSD .
Elliott Hughes23925bb2017-09-22 16:04:20 -07004344As a side effect, setting this flag turns off the
Geremy Condra03ebf062011-10-12 18:17:24 -07004345.Ic braceexpand
Elliott Hughes23925bb2017-09-22 16:04:20 -07004346and
4347.Ic utf8\-mode
4348flags, which can be turned back on manually, and
Geremy Condra03ebf062011-10-12 18:17:24 -07004349.Ic sh
Elliott Hughesfc0307d2016-02-02 15:26:47 -08004350mode (unless both are enabled at the same time).
Geremy Condra03ebf062011-10-12 18:17:24 -07004351.It Fl o Ic sh
4352Enable
4353.Pa /bin/sh
4354.Pq kludge
Elliott Hughesfc0307d2016-02-02 15:26:47 -08004355mode (see
4356.Sx SH mode ) .
Geremy Condra03ebf062011-10-12 18:17:24 -07004357Automatically enabled if the basename of the shell invocation begins with
4358.Dq sh
4359and this autodetection feature is compiled in
4360.Pq not in MirBSD .
4361As a side effect, setting this flag turns off
4362.Ic braceexpand
4363mode, which can be turned back on manually, and
4364.Ic posix
Elliott Hughesfc0307d2016-02-02 15:26:47 -08004365mode (unless both are enabled at the same time).
Geremy Condra03ebf062011-10-12 18:17:24 -07004366.It Fl o Ic vi
4367Enable
4368.Xr vi 1 Ns -like
4369command-line editing (interactive shells only).
Elliott Hughes737fdce2014-08-07 12:59:26 -07004370See
4371.Sx Vi editing mode
4372for documentation and limitations.
Geremy Condra03ebf062011-10-12 18:17:24 -07004373.It Fl o Ic vi\-esccomplete
4374In vi command-line editing, do command and file name completion when escape
4375(\*(ha[) is entered in command mode.
4376.It Fl o Ic vi\-tabcomplete
4377In vi command-line editing, do command and file name completion when tab (\*(haI)
4378is entered in insert mode.
4379This is the default.
4380.It Fl o Ic viraw
4381No effect.
4382In the original Korn shell, unless
4383.Ic viraw
4384was set, the vi command-line mode would let the
4385.Xr tty 4
4386driver do the work until ESC (\*(ha[) was entered.
4387.Nm
4388is always in viraw mode.
4389.El
4390.Pp
4391These options can also be used upon invocation of the shell.
4392The current set of
4393options (with single letter names) can be found in the parameter
Elliott Hughes966dd552016-12-08 15:56:04 -08004394.Dq Li $\- .
Geremy Condra03ebf062011-10-12 18:17:24 -07004395.Ic set Fl o
4396with no option name will list all the options and whether each is on or off;
4397.Ic set +o
4398will print the long names of all options that are currently on.
Elliott Hughes77740fc2016-08-12 15:06:53 -07004399In a future version,
4400.Ic set +o
4401will behave
4402.Tn POSIX
4403compliant and print commands to restore the current options instead.
Geremy Condra03ebf062011-10-12 18:17:24 -07004404.Pp
4405Remaining arguments, if any, are positional parameters and are assigned, in
4406order, to the positional parameters (i.e. $1, $2, etc.).
4407If options end with
Elliott Hughes966dd552016-12-08 15:56:04 -08004408.Dq Li \-\-
Geremy Condra03ebf062011-10-12 18:17:24 -07004409and there are no remaining arguments, all positional parameters are cleared.
4410If no options or arguments are given, the values of all names are printed.
4411For unknown historical reasons, a lone
Elliott Hughes966dd552016-12-08 15:56:04 -08004412.Dq Li \-
Geremy Condra03ebf062011-10-12 18:17:24 -07004413option is treated specially \*(en it clears both the
4414.Fl v
4415and
4416.Fl x
4417options.
4418.Pp
4419.It Ic shift Op Ar number
4420The positional parameters
4421.Ar number Ns +1 ,
4422.Ar number Ns +2 ,
Elliott Hughes966dd552016-12-08 15:56:04 -08004423etc. are renamed to 1, 2, etc.
Geremy Condra03ebf062011-10-12 18:17:24 -07004424.Ar number
4425defaults to 1.
4426.Pp
4427.It Ic sleep Ar seconds
4428Suspends execution for a minimum of the
4429.Ar seconds
4430specified as positive decimal value with an optional fractional part.
4431Signal delivery may continue execution earlier.
4432.Pp
4433.It Ic source Ar file Op Ar arg ...
4434Like
4435.Ic \&. Po Do dot Dc Pc ,
4436except that the current working directory is appended to the
Elliott Hughesfc0307d2016-02-02 15:26:47 -08004437search path (GNU
Geremy Condra03ebf062011-10-12 18:17:24 -07004438.Nm bash
Elliott Hughesfc0307d2016-02-02 15:26:47 -08004439extension).
Geremy Condra03ebf062011-10-12 18:17:24 -07004440.Pp
Elliott Hughes737fdce2014-08-07 12:59:26 -07004441.It Ic suspend
4442Stops the shell as if it had received the suspend character from
4443the terminal.
4444It is not possible to suspend a login shell unless the parent process
4445is a member of the same terminal session but is a member of a different
4446process group.
4447As a general rule, if the shell was started by another shell or via
4448.Xr su 1 ,
4449it can be suspended.
4450.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07004451.It Ic test Ar expression
4452.It Ic \&[ Ar expression Ic \&]
4453.Ic test
4454evaluates the
4455.Ar expression
4456and returns zero status if true, 1 if false, or greater than 1 if there
4457was an error.
4458It is normally used as the condition command of
4459.Ic if
4460and
4461.Ic while
4462statements.
4463Symbolic links are followed for all
4464.Ar file
4465expressions except
4466.Fl h
4467and
4468.Fl L .
4469.Pp
4470The following basic expressions are available:
4471.Bl -tag -width 17n
4472.It Fl a Ar file
4473.Ar file
4474exists.
4475.It Fl b Ar file
4476.Ar file
4477is a block special device.
4478.It Fl c Ar file
4479.Ar file
4480is a character special device.
4481.It Fl d Ar file
4482.Ar file
4483is a directory.
4484.It Fl e Ar file
4485.Ar file
4486exists.
4487.It Fl f Ar file
4488.Ar file
4489is a regular file.
4490.It Fl G Ar file
4491.Ar file Ns 's
4492group is the shell's effective group ID.
4493.It Fl g Ar file
4494.Ar file Ns 's
4495mode has the setgid bit set.
4496.It Fl H Ar file
4497.Ar file
4498is a context dependent directory (only useful on HP-UX).
4499.It Fl h Ar file
4500.Ar file
4501is a symbolic link.
4502.It Fl k Ar file
4503.Ar file Ns 's
4504mode has the
4505.Xr sticky 8
4506bit set.
4507.It Fl L Ar file
4508.Ar file
4509is a symbolic link.
4510.It Fl O Ar file
4511.Ar file Ns 's
4512owner is the shell's effective user ID.
Geremy Condra03ebf062011-10-12 18:17:24 -07004513.It Fl p Ar file
4514.Ar file
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00004515is a named pipe
4516.Pq Tn FIFO .
Geremy Condra03ebf062011-10-12 18:17:24 -07004517.It Fl r Ar file
4518.Ar file
4519exists and is readable.
4520.It Fl S Ar file
4521.Ar file
4522is a
4523.Xr unix 4 Ns -domain
4524socket.
4525.It Fl s Ar file
4526.Ar file
4527is not empty.
4528.It Fl t Ar fd
4529File descriptor
4530.Ar fd
4531is a
4532.Xr tty 4
4533device.
4534.It Fl u Ar file
4535.Ar file Ns 's
4536mode has the setuid bit set.
4537.It Fl w Ar file
4538.Ar file
4539exists and is writable.
4540.It Fl x Ar file
4541.Ar file
4542exists and is executable.
4543.It Ar file1 Fl nt Ar file2
4544.Ar file1
4545is newer than
4546.Ar file2
4547or
4548.Ar file1
4549exists and
4550.Ar file2
4551does not.
4552.It Ar file1 Fl ot Ar file2
4553.Ar file1
4554is older than
4555.Ar file2
4556or
4557.Ar file2
4558exists and
4559.Ar file1
4560does not.
4561.It Ar file1 Fl ef Ar file2
4562.Ar file1
4563is the same file as
4564.Ar file2 .
4565.It Ar string
4566.Ar string
4567has non-zero length.
4568.It Fl n Ar string
4569.Ar string
4570is not empty.
4571.It Fl z Ar string
4572.Ar string
4573is empty.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07004574.It Fl v Ar name
4575The shell parameter
4576.Ar name
4577is set.
4578.It Fl o Ar option
4579Shell
4580.Ar option
4581is set (see the
4582.Ic set
4583command above for a list of options).
4584As a non-standard extension, if the option starts with a
4585.Ql \&! ,
4586the test is negated; the test always fails if
4587.Ar option
4588doesn't exist (so [ \-o foo \-o \-o !foo ] returns true if and only if option
4589.Ar foo
4590exists).
4591The same can be achieved with [ \-o ?foo ] like in
4592.At
4593.Nm ksh93 .
4594.Ar option
4595can also be the short flag led by either
4596.Ql \-
4597or
4598.Ql +
4599.Pq no logical negation ,
4600for example
4601.Dq Li \-x
4602or
4603.Dq Li +x
4604instead of
4605.Dq Li xtrace .
Geremy Condra03ebf062011-10-12 18:17:24 -07004606.It Ar string No = Ar string
4607Strings are equal.
4608.It Ar string No == Ar string
4609Strings are equal.
4610.It Ar string No \*(Gt Ar string
4611First string operand is greater than second string operand.
4612.It Ar string No \*(Lt Ar string
4613First string operand is less than second string operand.
4614.It Ar string No != Ar string
4615Strings are not equal.
4616.It Ar number Fl eq Ar number
4617Numbers compare equal.
4618.It Ar number Fl ne Ar number
4619Numbers compare not equal.
4620.It Ar number Fl ge Ar number
4621Numbers compare greater than or equal.
4622.It Ar number Fl gt Ar number
4623Numbers compare greater than.
4624.It Ar number Fl le Ar number
4625Numbers compare less than or equal.
4626.It Ar number Fl \&lt Ar number
4627Numbers compare less than.
4628.El
4629.Pp
4630The above basic expressions, in which unary operators have precedence over
4631binary operators, may be combined with the following operators (listed in
4632increasing order of precedence):
4633.Bd -literal -offset indent
4634expr \-o expr Logical OR.
4635expr \-a expr Logical AND.
4636! expr Logical NOT.
4637( expr ) Grouping.
4638.Ed
4639.Pp
4640Note that a number actually may be an arithmetic expression, such as
4641a mathematical term or the name of an integer variable:
4642.Bd -literal -offset indent
4643x=1; [ "x" \-eq 1 ] evaluates to true
4644.Ed
4645.Pp
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00004646Note that some special rules are applied (courtesy of
4647.Px
4648) if the number of arguments to
Geremy Condra03ebf062011-10-12 18:17:24 -07004649.Ic test
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00004650or inside the brackets
Geremy Condra03ebf062011-10-12 18:17:24 -07004651.Ic \&[ ... \&]
4652is less than five: if leading
Elliott Hughes966dd552016-12-08 15:56:04 -08004653.Dq Li \&!
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00004654arguments can be stripped such that only one to three arguments remain,
4655then the lowered comparison is executed; (thanks to XSI) parentheses
4656.Ic \e( ... \e)
4657lower four- and three-argument forms to two- and one-argument forms,
4658respectively; three-argument forms ultimately prefer binary operations,
4659followed by negation and parenthesis lowering; two- and four-argument forms
4660prefer negation followed by parenthesis; the one-argument form always implies
4661.Fl n .
Geremy Condra03ebf062011-10-12 18:17:24 -07004662.Pp
4663.Sy Note :
4664A common mistake is to use
Elliott Hughes966dd552016-12-08 15:56:04 -08004665.Dq Li if \&[ $foo = bar \&]
Geremy Condra03ebf062011-10-12 18:17:24 -07004666which fails if parameter
4667.Dq foo
Elliott Hughes966dd552016-12-08 15:56:04 -08004668is empty or unset, if it has embedded spaces (i.e.\&
Geremy Condra03ebf062011-10-12 18:17:24 -07004669.Ev IFS
Elliott Hughes966dd552016-12-08 15:56:04 -08004670octets) or if it is a unary operator like
4671.Dq Li \&!
Geremy Condra03ebf062011-10-12 18:17:24 -07004672or
Elliott Hughes966dd552016-12-08 15:56:04 -08004673.Dq Li \-n .
Geremy Condra03ebf062011-10-12 18:17:24 -07004674Use tests like
Elliott Hughes966dd552016-12-08 15:56:04 -08004675.Dq Li if \&[ x\&"$foo\&" = x"bar" \&]
Geremy Condra03ebf062011-10-12 18:17:24 -07004676instead, or the double-bracket operator
Elliott Hughes966dd552016-12-08 15:56:04 -08004677.Dq Li if \&[[ $foo = bar \&]]
Geremy Condra03ebf062011-10-12 18:17:24 -07004678or, to avoid pattern matching (see
4679.Ic \&[[
4680above):
Elliott Hughes966dd552016-12-08 15:56:04 -08004681.Dq Li if \&[[ $foo = \&"$bar" \&]]
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00004682.Pp
4683The
Elliott Hughes966dd552016-12-08 15:56:04 -08004684.Ic \&[[ ... \&]]
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00004685construct is not only more secure to use but also often faster.
Geremy Condra03ebf062011-10-12 18:17:24 -07004686.Pp
4687.It Xo
4688.Ic time
4689.Op Fl p
4690.Op Ar pipeline
4691.Xc
4692If a
4693.Ar pipeline
4694is given, the times used to execute the pipeline are reported.
4695If no pipeline
4696is given, then the user and system time used by the shell itself, and all the
4697commands it has run since it was started, are reported.
4698The times reported are the real time (elapsed time from start to finish),
4699the user CPU time (time spent running in user mode), and the system CPU time
4700(time spent running in kernel mode).
4701Times are reported to standard error; the format of the output is:
4702.Pp
Elliott Hughes47086262019-03-26 12:34:31 -07004703.Dl "0m0.03s real 0m0.02s user 0m0.01s system"
Geremy Condra03ebf062011-10-12 18:17:24 -07004704.Pp
4705If the
4706.Fl p
4707option is given the output is slightly longer:
4708.Bd -literal -offset indent
Elliott Hughes47086262019-03-26 12:34:31 -07004709real 0.03
4710user 0.02
4711sys 0.01
Geremy Condra03ebf062011-10-12 18:17:24 -07004712.Ed
4713.Pp
4714It is an error to specify the
4715.Fl p
4716option unless
4717.Ar pipeline
4718is a simple command.
4719.Pp
4720Simple redirections of standard error do not affect the output of the
4721.Ic time
4722command:
4723.Pp
4724.Dl $ time sleep 1 2\*(Gtafile
4725.Dl $ { time sleep 1; } 2\*(Gtafile
4726.Pp
4727Times for the first command do not go to
4728.Dq afile ,
4729but those of the second command do.
4730.Pp
4731.It Ic times
4732Print the accumulated user and system times used both by the shell
4733and by processes that the shell started which have exited.
4734The format of the output is:
4735.Bd -literal -offset indent
Elliott Hughes47086262019-03-26 12:34:31 -070047360m0.01s 0m0.00s
47370m0.04s 0m0.02s
Geremy Condra03ebf062011-10-12 18:17:24 -07004738.Ed
4739.Pp
Elliott Hughes96b43632015-07-17 11:39:41 -07004740.It Ic trap Ar n Op Ar signal ...
4741If the first operand is a decimal unsigned integer, this resets all
4742specified signals to the default action, i.e. is the same as calling
4743.Ic trap
Elliott Hughes966dd552016-12-08 15:56:04 -08004744with a dash
4745.Pq Dq Li \-
Elliott Hughes96b43632015-07-17 11:39:41 -07004746as
4747.Ar handler ,
4748followed by the arguments
4749.Pq Ar n Op Ar signal ... ,
4750all of which are treated as signals.
4751.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07004752.It Ic trap Op Ar handler signal ...
Elliott Hughes96b43632015-07-17 11:39:41 -07004753Sets a trap handler that is to be executed when any of the specified
4754.Ar signal Ns s
4755are received.
Geremy Condra03ebf062011-10-12 18:17:24 -07004756.Ar handler
Elliott Hughes966dd552016-12-08 15:56:04 -08004757is either an empty string, indicating the signals are to be ignored, a dash
4758.Pq Dq Li \- ,
Elliott Hughes96b43632015-07-17 11:39:41 -07004759indicating that the default action is to be taken for the signals
4760.Pq see Xr signal 3 ,
4761or a string containing shell commands to be executed at the first opportunity
Elliott Hughes966dd552016-12-08 15:56:04 -08004762(i.e. when the current command completes or before printing the next
Geremy Condra03ebf062011-10-12 18:17:24 -07004763.Ev PS1
4764prompt) after receipt of one of the signals.
4765.Ar signal
Elliott Hughes96b43632015-07-17 11:39:41 -07004766is the name of a signal
4767.Pq e.g.\& Dv PIPE or Dv ALRM
Geremy Condra03ebf062011-10-12 18:17:24 -07004768or the number of the signal (see the
Elliott Hughes96b43632015-07-17 11:39:41 -07004769.Ic kill Fl l
Geremy Condra03ebf062011-10-12 18:17:24 -07004770command above).
4771.Pp
4772There are two special signals:
4773.Dv EXIT
Elliott Hughes96b43632015-07-17 11:39:41 -07004774.Pq also known as 0 ,
4775which is executed when the shell is about to exit, and
Geremy Condra03ebf062011-10-12 18:17:24 -07004776.Dv ERR ,
Elliott Hughes96b43632015-07-17 11:39:41 -07004777which is executed after an error occurs; an error is something
4778that would cause the shell to exit if the
4779.Ic set Fl e
Geremy Condra03ebf062011-10-12 18:17:24 -07004780or
Elliott Hughes96b43632015-07-17 11:39:41 -07004781.Ic set Fl o Ic errexit
4782option were set.
Geremy Condra03ebf062011-10-12 18:17:24 -07004783.Dv EXIT
4784handlers are executed in the environment of the last executed command.
Geremy Condra03ebf062011-10-12 18:17:24 -07004785.Pp
Elliott Hughes96b43632015-07-17 11:39:41 -07004786Note that, for non-interactive shells, the trap handler cannot be changed
4787for signals that were ignored when the shell started.
4788.Pp
4789With no arguments, the current state of the traps that have been set since
4790the shell started is shown as a series of
Geremy Condra03ebf062011-10-12 18:17:24 -07004791.Ic trap
Elliott Hughes96b43632015-07-17 11:39:41 -07004792commands.
Geremy Condra03ebf062011-10-12 18:17:24 -07004793Note that the output of
4794.Ic trap
4795cannot be usefully piped to another process (an artifact of the fact that
4796traps are cleared when subprocesses are created).
4797.Pp
4798The original Korn shell's
4799.Dv DEBUG
4800trap and the handling of
4801.Dv ERR
4802and
4803.Dv EXIT
4804traps in functions are not yet implemented.
4805.Pp
4806.It Ic true
4807A command that exits with a zero value.
4808.Pp
4809.It Xo
Elliott Hughesa3c3f962017-04-12 16:52:30 -07004810.Ic typeset
4811.Op Ic +\-aglpnrtUux
4812.Oo Fl L Ns Op Ar n
4813.No \*(Ba Fl R Ns Op Ar n
4814.No \*(Ba Fl Z Ns Op Ar n Oc
Geremy Condra03ebf062011-10-12 18:17:24 -07004815.Op Fl i Ns Op Ar n
Geremy Condra03ebf062011-10-12 18:17:24 -07004816.Oo Ar name
4817.Op Ns = Ns Ar value
4818.Ar ... Oc
4819.Xc
4820.It Xo
4821.Ic typeset
Elliott Hughesa3c3f962017-04-12 16:52:30 -07004822.Fl f Op Fl tux
4823.Op Ar name ...
Geremy Condra03ebf062011-10-12 18:17:24 -07004824.Xc
4825Display or set parameter attributes.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07004826This is a declaration utility.
Geremy Condra03ebf062011-10-12 18:17:24 -07004827With no
4828.Ar name
4829arguments, parameter attributes are displayed; if no options are used, the
4830current attributes of all parameters are printed as
4831.Ic typeset
4832commands; if an option is given (or
Elliott Hughes966dd552016-12-08 15:56:04 -08004833.Dq Li \-
Geremy Condra03ebf062011-10-12 18:17:24 -07004834with no option letter), all parameters and their values with the specified
4835attributes are printed; if options are introduced with
4836.Ql + ,
4837parameter values are not printed.
4838.Pp
4839If
4840.Ar name
4841arguments are given, the attributes of the named parameters are set
Elliott Hughesa3c3f962017-04-12 16:52:30 -07004842.Pq Ic \&\-
Geremy Condra03ebf062011-10-12 18:17:24 -07004843or cleared
Elliott Hughesa3c3f962017-04-12 16:52:30 -07004844.Pq Ic \&+ ;
4845inside a function, this will cause the parameters to be created
4846(with no value) in the local scope (but see
4847.Fl g ) .
Geremy Condra03ebf062011-10-12 18:17:24 -07004848Values for parameters may optionally be specified.
4849For
4850.Ar name Ns \&[*] ,
Elliott Hughesa3c3f962017-04-12 16:52:30 -07004851the change affects all elements of the array, and no value may be specified.
Geremy Condra03ebf062011-10-12 18:17:24 -07004852.Pp
4853When
4854.Fl f
4855is used,
4856.Ic typeset
4857operates on the attributes of functions.
4858As with parameters, if no
4859.Ar name
4860arguments are given,
4861functions are listed with their values (i.e. definitions) unless
4862options are introduced with
4863.Ql + ,
4864in which case only the function names are reported.
4865.Bl -tag -width Ds
4866.It Fl a
4867Indexed array attribute.
4868.It Fl f
4869Function mode.
4870Display or set functions and their attributes, instead of parameters.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07004871.It Fl g
4872Do not cause named parameters to be created in
4873the local scope when called inside a function.
Geremy Condra03ebf062011-10-12 18:17:24 -07004874.It Fl i Ns Op Ar n
4875Integer attribute.
4876.Ar n
4877specifies the base to use when displaying the integer (if not specified, the
4878base given in the first assignment is used).
4879Parameters with this attribute may
4880be assigned values containing arithmetic expressions.
4881.It Fl L Ns Op Ar n
4882Left justify attribute.
4883.Ar n
4884specifies the field width.
4885If
4886.Ar n
4887is not specified, the current width of a parameter (or the width of its first
4888assigned value) is used.
4889Leading whitespace (and zeros, if used with the
4890.Fl Z
4891option) is stripped.
4892If necessary, values are either truncated or space padded
4893to fit the field width.
4894.It Fl l
4895Lower case attribute.
Elliott Hughes966dd552016-12-08 15:56:04 -08004896All upper case ASCII characters in values are converted to lower case.
Geremy Condra03ebf062011-10-12 18:17:24 -07004897(In the original Korn shell, this parameter meant
4898.Dq long integer
4899when used with the
4900.Fl i
4901option.)
4902.It Fl n
4903Create a bound variable (name reference): any access to the variable
4904.Ar name
4905will access the variable
4906.Ar value
4907in the current scope (this is different from
4908.At
4909.Nm ksh93 ! )
4910instead.
4911Also different from
4912.At
4913.Nm ksh93
4914is that
4915.Ar value
4916is lazily evaluated at the time
4917.Ar name
4918is accessed.
4919This can be used by functions to access variables whose names are
Elliott Hughes966dd552016-12-08 15:56:04 -08004920passed as parameters, instead of using
Geremy Condra03ebf062011-10-12 18:17:24 -07004921.Ic eval .
4922.It Fl p
4923Print complete
4924.Ic typeset
4925commands that can be used to re-create the attributes and values of
4926parameters.
4927.It Fl R Ns Op Ar n
4928Right justify attribute.
4929.Ar n
4930specifies the field width.
4931If
4932.Ar n
4933is not specified, the current width of a parameter (or the width of its first
4934assigned value) is used.
4935Trailing whitespace is stripped.
4936If necessary, values are either stripped of leading characters or space
4937padded to make them fit the field width.
4938.It Fl r
4939Read-only attribute.
4940Parameters with this attribute may not be assigned to or unset.
4941Once this attribute is set, it cannot be turned off.
4942.It Fl t
4943Tag attribute.
4944Has no meaning to the shell; provided for application use.
4945.Pp
4946For functions,
4947.Fl t
4948is the trace attribute.
4949When functions with the trace attribute are executed, the
4950.Ic xtrace
4951.Pq Fl x
4952shell option is temporarily turned on.
4953.It Fl U
4954Unsigned integer attribute.
4955Integers are printed as unsigned values (combine with the
4956.Fl i
4957option).
4958This option is not in the original Korn shell.
4959.It Fl u
4960Upper case attribute.
Elliott Hughes966dd552016-12-08 15:56:04 -08004961All lower case ASCII characters in values are converted to upper case.
Geremy Condra03ebf062011-10-12 18:17:24 -07004962(In the original Korn shell, this parameter meant
4963.Dq unsigned integer
4964when used with the
4965.Fl i
4966option which meant upper case letters would never be used for bases greater
4967than 10.
Elliott Hughes47086262019-03-26 12:34:31 -07004968See
Geremy Condra03ebf062011-10-12 18:17:24 -07004969.Fl U
Elliott Hughes47086262019-03-26 12:34:31 -07004970above.)
Geremy Condra03ebf062011-10-12 18:17:24 -07004971.Pp
4972For functions,
4973.Fl u
4974is the undefined attribute.
4975See
4976.Sx Functions
4977above for the implications of this.
4978.It Fl x
4979Export attribute.
Elliott Hughes47086262019-03-26 12:34:31 -07004980Parameters are placed in the environment of any executed commands.
4981Functions cannot be exported for security reasons
4982.Pq Dq shellshock .
Geremy Condra03ebf062011-10-12 18:17:24 -07004983.It Fl Z Ns Op Ar n
4984Zero fill attribute.
4985If not combined with
4986.Fl L ,
4987this is the same as
4988.Fl R ,
4989except zero padding is used instead of space padding.
Elliott Hughes47086262019-03-26 12:34:31 -07004990For integers, the number is padded, not the base.
Geremy Condra03ebf062011-10-12 18:17:24 -07004991.El
4992.Pp
4993If any of the
4994.\" long integer ,
4995.Fl i ,
4996.Fl L ,
4997.Fl l ,
4998.Fl R ,
4999.Fl U ,
Elliott Hughes966dd552016-12-08 15:56:04 -08005000.Fl u
Geremy Condra03ebf062011-10-12 18:17:24 -07005001or
5002.Fl Z
5003options are changed, all others from this set are cleared,
5004unless they are also given on the same command line.
5005.Pp
5006.It Xo
5007.Ic ulimit
Elliott Hughes737fdce2014-08-07 12:59:26 -07005008.Op Fl aBCcdefHilMmnOPpqrSsTtVvw
Geremy Condra03ebf062011-10-12 18:17:24 -07005009.Op Ar value
5010.Xc
5011Display or set process limits.
5012If no options are used, the file size limit
5013.Pq Fl f
5014is assumed.
5015.Ar value ,
5016if specified, may be either an arithmetic expression or the word
5017.Dq unlimited .
5018The limits affect the shell and any processes created by the shell after a
5019limit is imposed.
5020Note that some systems may not allow limits to be increased
5021once they are set.
5022Also note that the types of limits available are system
5023dependent \*(en some systems have only the
5024.Fl f
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005025limit, or not even that, or can set only the soft limits
Geremy Condra03ebf062011-10-12 18:17:24 -07005026.Bl -tag -width 5n
5027.It Fl a
5028Display all limits; unless
5029.Fl H
5030is used, soft limits are displayed.
5031.It Fl B Ar n
5032Set the socket buffer size to
5033.Ar n
5034kibibytes.
5035.It Fl C Ar n
5036Set the number of cached threads to
5037.Ar n .
5038.It Fl c Ar n
5039Impose a size limit of
5040.Ar n
5041blocks on the size of core dumps.
5042.It Fl d Ar n
5043Impose a size limit of
5044.Ar n
5045kibibytes on the size of the data area.
5046.It Fl e Ar n
5047Set the maximum niceness to
5048.Ar n .
5049.It Fl f Ar n
5050Impose a size limit of
5051.Ar n
5052blocks on files written by the shell and its child processes (files of any
5053size may be read).
5054.It Fl H
5055Set the hard limit only (the default is to set both hard and soft limits).
5056.It Fl i Ar n
5057Set the number of pending signals to
5058.Ar n .
Geremy Condra03ebf062011-10-12 18:17:24 -07005059.It Fl l Ar n
5060Impose a limit of
5061.Ar n
5062kibibytes on the amount of locked (wired) physical memory.
5063.It Fl M Ar n
5064Set the AIO locked memory to
5065.Ar n
5066kibibytes.
5067.It Fl m Ar n
5068Impose a limit of
5069.Ar n
5070kibibytes on the amount of physical memory used.
5071.It Fl n Ar n
5072Impose a limit of
5073.Ar n
5074file descriptors that can be open at once.
5075.It Fl O Ar n
5076Set the number of AIO operations to
5077.Ar n .
5078.It Fl P Ar n
5079Limit the number of threads per process to
5080.Ar n .
5081.It Fl p Ar n
5082Impose a limit of
5083.Ar n
5084processes that can be run by the user at any one time.
5085.It Fl q Ar n
5086Limit the size of
5087.Tn POSIX
5088message queues to
5089.Ar n
5090bytes.
5091.It Fl r Ar n
5092Set the maximum real-time priority to
5093.Ar n .
5094.It Fl S
5095Set the soft limit only (the default is to set both hard and soft limits).
5096.It Fl s Ar n
5097Impose a size limit of
5098.Ar n
5099kibibytes on the size of the stack area.
5100.It Fl T Ar n
5101Impose a time limit of
5102.Ar n
5103real seconds to be used by each process.
5104.It Fl t Ar n
5105Impose a time limit of
5106.Ar n
5107CPU seconds spent in user mode to be used by each process.
5108.It Fl V Ar n
5109Set the number of vnode monitors on Haiku to
5110.Ar n .
5111.It Fl v Ar n
5112Impose a limit of
5113.Ar n
5114kibibytes on the amount of virtual memory (address space) used.
5115.It Fl w Ar n
5116Impose a limit of
5117.Ar n
5118kibibytes on the amount of swap space used.
5119.El
5120.Pp
5121As far as
5122.Ic ulimit
5123is concerned, a block is 512 bytes.
5124.Pp
5125.It Xo
5126.Ic umask
5127.Op Fl S
5128.Op Ar mask
5129.Xc
Elliott Hughes966dd552016-12-08 15:56:04 -08005130Display or set the file permission creation mask or umask (see
Geremy Condra03ebf062011-10-12 18:17:24 -07005131.Xr umask 2 ) .
5132If the
5133.Fl S
5134option is used, the mask displayed or set is symbolic; otherwise, it is an
5135octal number.
5136.Pp
5137Symbolic masks are like those used by
5138.Xr chmod 1 .
5139When used, they describe what permissions may be made available (as opposed to
5140octal masks in which a set bit means the corresponding bit is to be cleared).
5141For example,
Elliott Hughes966dd552016-12-08 15:56:04 -08005142.Dq Li ug=rwx,o=
5143sets the mask so files will not be readable, writable or executable by
Geremy Condra03ebf062011-10-12 18:17:24 -07005144.Dq others ,
5145and is equivalent (on most systems) to the octal mask
Elliott Hughes966dd552016-12-08 15:56:04 -08005146.Dq Li 007 .
Geremy Condra03ebf062011-10-12 18:17:24 -07005147.Pp
5148.It Xo
5149.Ic unalias
5150.Op Fl adt
5151.Op Ar name ...
5152.Xc
5153The aliases for the given names are removed.
5154If the
5155.Fl a
5156option is used, all aliases are removed.
5157If the
5158.Fl t
5159or
5160.Fl d
5161options are used, the indicated operations are carried out on tracked or
5162directory aliases, respectively.
5163.Pp
5164.It Xo
5165.Ic unset
5166.Op Fl fv
5167.Ar parameter ...
5168.Xc
5169Unset the named parameters
5170.Po
5171.Fl v ,
5172the default
5173.Pc
5174or functions
5175.Pq Fl f .
5176With
5177.Ar parameter Ns \&[*] ,
5178attributes are kept, only values are unset.
5179.Pp
5180The exit status is non-zero if any of the parameters have the read-only
5181attribute set, zero otherwise.
5182.Pp
5183.It Ic wait Op Ar job ...
5184Wait for the specified job(s) to finish.
5185The exit status of
5186.Ic wait
5187is that of the last specified job; if the last job is killed by a signal, the
5188exit status is 128 + the number of the signal (see
Elliott Hughes96b43632015-07-17 11:39:41 -07005189.Ic kill Fl l Ar exit-status
Elliott Hughes966dd552016-12-08 15:56:04 -08005190above); if the last specified job can't be found (because it never existed or
Geremy Condra03ebf062011-10-12 18:17:24 -07005191had already finished), the exit status of
5192.Ic wait
5193is 127.
5194See
5195.Sx Job control
5196below for the format of
5197.Ar job .
5198.Ic wait
Elliott Hughes966dd552016-12-08 15:56:04 -08005199will return if a signal for which a trap has been set is received or if a
Geremy Condra03ebf062011-10-12 18:17:24 -07005200.Dv SIGHUP ,
Elliott Hughes966dd552016-12-08 15:56:04 -08005201.Dv SIGINT
Geremy Condra03ebf062011-10-12 18:17:24 -07005202or
5203.Dv SIGQUIT
5204signal is received.
5205.Pp
5206If no jobs are specified,
5207.Ic wait
5208waits for all currently running jobs (if any) to finish and exits with a zero
5209status.
5210If job monitoring is enabled, the completion status of jobs is printed
5211(this is not the case when jobs are explicitly specified).
5212.Pp
5213.It Xo
5214.Ic whence
5215.Op Fl pv
5216.Op Ar name ...
5217.Xc
Geremy Condra03ebf062011-10-12 18:17:24 -07005218Without the
5219.Fl v
Elliott Hughes77740fc2016-08-12 15:06:53 -07005220option, it is the same as
5221.Ic command Fl v ,
5222except aliases are not printed as alias command.
Geremy Condra03ebf062011-10-12 18:17:24 -07005223With the
5224.Fl v
Elliott Hughes77740fc2016-08-12 15:06:53 -07005225option, it is exactly the same as
Geremy Condra03ebf062011-10-12 18:17:24 -07005226.Ic command Fl V .
Elliott Hughes77740fc2016-08-12 15:06:53 -07005227In either case, the
Geremy Condra03ebf062011-10-12 18:17:24 -07005228.Fl p
Elliott Hughes77740fc2016-08-12 15:06:53 -07005229option differs: the search path is not affected in
5230.Ic whence ,
5231but the search is restricted to the path.
Geremy Condra03ebf062011-10-12 18:17:24 -07005232.El
5233.Ss Job control
5234Job control refers to the shell's ability to monitor and control jobs which
5235are processes or groups of processes created for commands or pipelines.
5236At a minimum, the shell keeps track of the status of the background (i.e.\&
5237asynchronous) jobs that currently exist; this information can be displayed
5238using the
5239.Ic jobs
5240commands.
5241If job control is fully enabled (using
Elliott Hughes96b43632015-07-17 11:39:41 -07005242.Ic set Fl m
Geremy Condra03ebf062011-10-12 18:17:24 -07005243or
Elliott Hughes96b43632015-07-17 11:39:41 -07005244.Ic set Fl o Ic monitor ) ,
Geremy Condra03ebf062011-10-12 18:17:24 -07005245as it is for interactive shells, the processes of a job are placed in their
5246own process group.
Elliott Hughes47086262019-03-26 12:34:31 -07005247Foreground jobs can be stopped by typing the suspend character from
5248the terminal (normally \*(haZ); jobs can be restarted in either the
5249foreground or background using the commands
Geremy Condra03ebf062011-10-12 18:17:24 -07005250.Ic fg
5251and
Elliott Hughes47086262019-03-26 12:34:31 -07005252.Ic bg .
Geremy Condra03ebf062011-10-12 18:17:24 -07005253.Pp
5254Note that only commands that create processes (e.g. asynchronous commands,
Elliott Hughes966dd552016-12-08 15:56:04 -08005255subshell commands and non-built-in, non-function commands) can be stopped;
Geremy Condra03ebf062011-10-12 18:17:24 -07005256commands like
5257.Ic read
5258cannot be.
5259.Pp
5260When a job is created, it is assigned a job number.
5261For interactive shells, this number is printed inside
Elliott Hughes966dd552016-12-08 15:56:04 -08005262.Dq Li \&[...] ,
Geremy Condra03ebf062011-10-12 18:17:24 -07005263followed by the process IDs of the processes in the job when an asynchronous
5264command is run.
5265A job may be referred to in the
5266.Ic bg ,
5267.Ic fg ,
5268.Ic jobs ,
Elliott Hughes966dd552016-12-08 15:56:04 -08005269.Ic kill
Geremy Condra03ebf062011-10-12 18:17:24 -07005270and
5271.Ic wait
5272commands either by the process ID of the last process in the command pipeline
5273(as stored in the
Elliott Hughes966dd552016-12-08 15:56:04 -08005274.Ic \&$!
5275parameter) or by prefixing the job number with a percent sign
5276.Pq Ql % .
Geremy Condra03ebf062011-10-12 18:17:24 -07005277Other percent sequences can also be used to refer to jobs:
5278.Bl -tag -width "%+ x %% x %XX"
5279.It %+ \*(Ba %% \*(Ba %
Elliott Hughes966dd552016-12-08 15:56:04 -08005280The most recently stopped job or, if there are no stopped jobs, the oldest
Geremy Condra03ebf062011-10-12 18:17:24 -07005281running job.
5282.It %\-
5283The job that would be the
5284.Ic %+
5285job if the latter did not exist.
5286.It % Ns Ar n
5287The job with job number
5288.Ar n .
5289.It %? Ns Ar string
5290The job with its command containing the string
5291.Ar string
5292(an error occurs if multiple jobs are matched).
5293.It % Ns Ar string
5294The job with its command starting with the string
5295.Ar string
5296(an error occurs if multiple jobs are matched).
5297.El
5298.Pp
5299When a job changes state (e.g. a background job finishes or foreground job is
5300stopped), the shell prints the following status information:
5301.Pp
5302.D1 [ Ns Ar number ] Ar flag status command
5303.Pp
5304where...
5305.Bl -tag -width "command"
5306.It Ar number
5307is the job number of the job;
5308.It Ar flag
5309is the
5310.Ql +
5311or
5312.Ql \-
5313character if the job is the
5314.Ic %+
5315or
5316.Ic %\-
5317job, respectively, or space if it is neither;
5318.It Ar status
5319indicates the current state of the job and can be:
5320.Bl -tag -width "RunningXX"
5321.It Done Op Ar number
5322The job exited.
5323.Ar number
5324is the exit status of the job which is omitted if the status is zero.
5325.It Running
5326The job has neither stopped nor exited (note that running does not necessarily
5327mean consuming CPU time \*(en
5328the process could be blocked waiting for some event).
5329.It Stopped Op Ar signal
5330The job was stopped by the indicated
5331.Ar signal
5332(if no signal is given, the job was stopped by
5333.Dv SIGTSTP ) .
5334.It Ar signal-description Op Dq core dumped
5335The job was killed by a signal (e.g. memory fault, hangup); use
Elliott Hughes96b43632015-07-17 11:39:41 -07005336.Ic kill Fl l
Geremy Condra03ebf062011-10-12 18:17:24 -07005337for a list of signal descriptions.
5338The
Elliott Hughes966dd552016-12-08 15:56:04 -08005339.Dq Li core dumped
Geremy Condra03ebf062011-10-12 18:17:24 -07005340message indicates the process created a core file.
5341.El
5342.It Ar command
5343is the command that created the process.
5344If there are multiple processes in
5345the job, each process will have a line showing its
5346.Ar command
5347and possibly its
5348.Ar status ,
5349if it is different from the status of the previous process.
5350.El
5351.Pp
5352When an attempt is made to exit the shell while there are jobs in the stopped
5353state, the shell warns the user that there are stopped jobs and does not exit.
5354If another attempt is immediately made to exit the shell, the stopped jobs are
5355sent a
5356.Dv SIGHUP
5357signal and the shell exits.
5358Similarly, if the
5359.Ic nohup
5360option is not set and there are running jobs when an attempt is made to exit
5361a login shell, the shell warns the user and does not exit.
5362If another attempt
5363is immediately made to exit the shell, the running jobs are sent a
5364.Dv SIGHUP
5365signal and the shell exits.
Elliott Hughes47086262019-03-26 12:34:31 -07005366.Ss Terminal state
5367The state of the controlling terminal can be modified by a command
5368executed in the foreground, whether or not job control is enabled, but
5369the modified terminal state is only kept past the job's lifetime and used
5370for later command invocations if the command exits successfully (i.e.\&
5371with an exit status of 0).
5372When such a job is momentarily stopped or restarted, the terminal state
5373is saved and restored, respectively, but it will not be kept afterwards.
5374In interactive mode, when line editing is enabled, the terminal state is
5375saved before being reconfigured by the shell for the line editor, then
5376restored before running a command.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005377.Ss POSIX mode
5378Entering
5379.Ic set Fl o Ic posix
5380mode will cause
5381.Nm
5382to behave even more
5383.Tn POSIX
5384compliant in places where the defaults or opinions differ.
5385Note that
5386.Nm mksh
Elliott Hughes966dd552016-12-08 15:56:04 -08005387will still operate with unsigned 32-bit arithmetic; use
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005388.Nm lksh
Elliott Hughes966dd552016-12-08 15:56:04 -08005389if arithmetic on the host
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005390.Vt long
Elliott Hughes966dd552016-12-08 15:56:04 -08005391data type, complete with ISO C Undefined Behaviour, is required;
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005392refer to the
5393.Xr lksh 1
5394manual page for details.
5395Most other historic,
5396.At
Elliott Hughes966dd552016-12-08 15:56:04 -08005397.Nm ksh Ns -compatible
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005398or opinionated differences can be disabled by using this mode; these are:
5399.Bl -bullet
5400.It
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005401The incompatible GNU
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005402.Nm bash
5403I/O redirection
5404.Ic &\*(Gt Ns Ar file
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005405is not supported.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005406.It
5407File descriptors created by I/O redirections are inherited by
5408child processes.
5409.It
5410Numbers with a leading digit zero are interpreted as octal.
5411.It
5412The
5413.Nm echo
5414builtin does not interpret backslashes and only supports the exact option
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005415.Fl n .
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005416.It
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005417Alias expansion with a trailing space only reruns on command words.
5418.It
5419Tilde expansion follows POSIX instead of Korn shell rules.
5420.It
5421The exit status of
5422.Ic fg
5423is always 0.
5424.It
5425.Ic kill
5426.Fl l
5427only lists signal names, all in one line.
5428.It
5429.Ic getopts
5430does not accept options with a leading
5431.Ql + .
Elliott Hughes23925bb2017-09-22 16:04:20 -07005432.It
5433.Ic exec
5434skips builtins, functions and other commands and uses a
5435.Ev PATH
5436search to determine the utility to execute.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005437.El
5438.Ss SH mode
5439Compatibility mode; intended for use with legacy scripts that
5440cannot easily be fixed; the changes are as follows:
5441.Bl -bullet
5442.It
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005443The incompatible GNU
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005444.Nm bash
5445I/O redirection
5446.Ic &\*(Gt Ns Ar file
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005447is not supported.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005448.It
5449File descriptors created by I/O redirections are inherited by
5450child processes.
5451.It
5452The
5453.Nm echo
5454builtin does not interpret backslashes and only supports the exact option
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005455.Fl n ,
5456unless built with
5457.Ev \-DMKSH_MIDNIGHTBSD01ASH_COMPAT .
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005458.It
Elliott Hughes77740fc2016-08-12 15:06:53 -07005459The substitution operations
5460.Sm off
5461.Xo
5462.Pf ${ Ar x
5463.Pf # Ar pat No } ,
5464.Sm on
5465.Xc
5466.Sm off
5467.Xo
5468.Pf ${ Ar x
5469.Pf ## Ar pat No } ,
5470.Sm on
5471.Xc
5472.Sm off
5473.Xo
5474.Pf ${ Ar x
5475.Pf % Ar pat No } ,
5476.Sm on
5477.Xc
5478and
5479.Sm off
5480.Xo
5481.Pf ${ Ar x
5482.Pf %% Ar pat No }
5483.Sm on
5484.Xc
5485wrongly do not require a parenthesis to be escaped and do not parse extglobs.
5486.It
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005487The getopt construct from
5488.Xr lksh 1
5489passes through the errorlevel.
5490.It
5491.Nm sh
5492.Fl c
5493eats a leading
5494.Fl \-
5495if built with
5496.Ev \-DMKSH_MIDNIGHTBSD01ASH_COMPAT .
Elliott Hughesfc0307d2016-02-02 15:26:47 -08005497.El
Geremy Condra03ebf062011-10-12 18:17:24 -07005498.Ss Interactive input line editing
5499The shell supports three modes of reading command lines from a
5500.Xr tty 4
5501in an interactive session, controlled by the
5502.Ic emacs ,
Elliott Hughes966dd552016-12-08 15:56:04 -08005503.Ic gmacs
Geremy Condra03ebf062011-10-12 18:17:24 -07005504and
5505.Ic vi
5506options (at most one of these can be set at once).
5507The default is
5508.Ic emacs .
5509Editing modes can be set explicitly using the
5510.Ic set
5511built-in.
5512If none of these options are enabled,
5513the shell simply reads lines using the normal
5514.Xr tty 4
5515driver.
5516If the
5517.Ic emacs
5518or
5519.Ic gmacs
5520option is set, the shell allows emacs-like editing of the command; similarly,
5521if the
5522.Ic vi
5523option is set, the shell allows vi-like editing of the command.
5524These modes are described in detail in the following sections.
5525.Pp
5526In these editing modes, if a line is longer than the screen width (see the
5527.Ev COLUMNS
5528parameter),
5529a
5530.Ql \*(Gt ,
Elliott Hughes966dd552016-12-08 15:56:04 -08005531.Ql +
Geremy Condra03ebf062011-10-12 18:17:24 -07005532or
5533.Ql \*(Lt
5534character is displayed in the last column indicating that there are more
5535characters after, before and after, or before the current position,
5536respectively.
5537The line is scrolled horizontally as necessary.
5538.Pp
5539Completed lines are pushed into the history, unless they begin with an
Elliott Hughes966dd552016-12-08 15:56:04 -08005540IFS octet or IFS white space or are the same as the previous line.
Geremy Condra03ebf062011-10-12 18:17:24 -07005541.Ss Emacs editing mode
5542When the
5543.Ic emacs
5544option is set, interactive input line editing is enabled.
5545Warning: This mode is
5546slightly different from the emacs mode in the original Korn shell.
5547In this mode, various editing commands
5548(typically bound to one or more control characters) cause immediate actions
5549without waiting for a newline.
5550Several editing commands are bound to particular
5551control characters when the shell is invoked; these bindings can be changed
5552using the
5553.Ic bind
5554command.
5555.Pp
5556The following is a list of available editing commands.
5557Each description starts with the name of the command,
5558suffixed with a colon;
5559an
5560.Op Ar n
5561(if the command can be prefixed with a count); and any keys the command is
5562bound to by default, written using caret notation
5563e.g. the ASCII ESC character is written as \*(ha[.
5564These control sequences are not case sensitive.
5565A count prefix for a command is entered using the sequence
5566.Pf \*(ha[ Ns Ar n ,
5567where
5568.Ar n
5569is a sequence of 1 or more digits.
5570Unless otherwise specified, if a count is
5571omitted, it defaults to 1.
5572.Pp
5573Note that editing command names are used only with the
5574.Ic bind
5575command.
5576Furthermore, many editing commands are useful only on terminals with
5577a visible cursor.
Geremy Condra03ebf062011-10-12 18:17:24 -07005578The user's
5579.Xr tty 4
5580characters (e.g.\&
5581.Dv ERASE )
5582are bound to
Elliott Hughes77740fc2016-08-12 15:06:53 -07005583reasonable substitutes and override the default bindings;
5584their customary values are shown in parentheses below.
5585The default bindings were chosen to resemble corresponding
5586Emacs key bindings:
Geremy Condra03ebf062011-10-12 18:17:24 -07005587.Bl -tag -width Ds
Elliott Hughes77740fc2016-08-12 15:06:53 -07005588.It Xo abort:
5589.No INTR Pq \*(haC ,
5590.No \*(haG
5591.Xc
Elliott Hughes23925bb2017-09-22 16:04:20 -07005592Abort the current command, save it to the history, empty the line buffer and
Geremy Condra03ebf062011-10-12 18:17:24 -07005593set the exit state to interrupted.
5594.It auto\-insert: Op Ar n
5595Simply causes the character to appear as literal input.
5596Most ordinary characters are bound to this.
5597.It Xo backward\-char:
5598.Op Ar n
Elliott Hughes96b43632015-07-17 11:39:41 -07005599.No \*(haB , \*(haXD , ANSI-CurLeft , PC-CurLeft
Geremy Condra03ebf062011-10-12 18:17:24 -07005600.Xc
5601Moves the cursor backward
5602.Ar n
5603characters.
5604.It Xo backward\-word:
5605.Op Ar n
5606.No \*(ha[b , ANSI-Ctrl-CurLeft , ANSI-Alt-CurLeft
5607.Xc
5608Moves the cursor backward to the beginning of the word; words consist of
5609alphanumerics, underscore
Elliott Hughes966dd552016-12-08 15:56:04 -08005610.Pq Ql _
Geremy Condra03ebf062011-10-12 18:17:24 -07005611and dollar sign
Elliott Hughes966dd552016-12-08 15:56:04 -08005612.Pq Ql $
Geremy Condra03ebf062011-10-12 18:17:24 -07005613characters.
5614.It beginning\-of\-history: \*(ha[\*(Lt
5615Moves to the beginning of the history.
Elliott Hughes96b43632015-07-17 11:39:41 -07005616.It beginning\-of\-line: \*(haA, ANSI-Home, PC-Home
Geremy Condra03ebf062011-10-12 18:17:24 -07005617Moves the cursor to the beginning of the edited input line.
5618.It Xo capitalise\-word:
5619.Op Ar n
5620.No \*(ha[C , \*(ha[c
5621.Xc
Elliott Hughes966dd552016-12-08 15:56:04 -08005622Uppercase the first ASCII character in the next
Geremy Condra03ebf062011-10-12 18:17:24 -07005623.Ar n
5624words, leaving the cursor past the end of the last word.
5625.It clear\-screen: \*(ha[\*(haL
5626Prints a compile-time configurable sequence to clear the screen and home
Elliott Hughes23925bb2017-09-22 16:04:20 -07005627the cursor, redraws the last line of the prompt string and the currently
5628edited input line.
Geremy Condra03ebf062011-10-12 18:17:24 -07005629The default sequence works for almost all standard terminals.
5630.It comment: \*(ha[#
5631If the current line does not begin with a comment character, one is added at
5632the beginning of the line and the line is entered (as if return had been
5633pressed); otherwise, the existing comment characters are removed and the cursor
5634is placed at the beginning of the line.
5635.It complete: \*(ha[\*(ha[
5636Automatically completes as much as is unique of the command name or the file
5637name containing the cursor.
5638If the entire remaining command or file name is
5639unique, a space is printed after its completion, unless it is a directory name
5640in which case
5641.Ql /
5642is appended.
5643If there is no command or file name with the current partial word
5644as its prefix, a bell character is output (usually causing a beep to be
5645sounded).
5646.It complete\-command: \*(haX\*(ha[
5647Automatically completes as much as is unique of the command name having the
5648partial word up to the cursor as its prefix, as in the
5649.Ic complete
5650command above.
5651.It complete\-file: \*(ha[\*(haX
5652Automatically completes as much as is unique of the file name having the
5653partial word up to the cursor as its prefix, as in the
5654.Ic complete
5655command described above.
5656.It complete\-list: \*(haI, \*(ha[=
Elliott Hughes966dd552016-12-08 15:56:04 -08005657Complete as much as is possible of the current word
Geremy Condra03ebf062011-10-12 18:17:24 -07005658and list the possible completions for it.
5659If only one completion is possible,
5660match as in the
5661.Ic complete
5662command above.
5663Note that \*(haI is usually generated by the TAB (tabulator) key.
5664.It Xo delete\-char\-backward:
5665.Op Ar n
Elliott Hughes77740fc2016-08-12 15:06:53 -07005666.No ERASE Pq \*(haH ,
5667.No \*(ha? , \*(haH
Geremy Condra03ebf062011-10-12 18:17:24 -07005668.Xc
5669Deletes
5670.Ar n
5671characters before the cursor.
5672.It Xo delete\-char\-forward:
5673.Op Ar n
Elliott Hughes96b43632015-07-17 11:39:41 -07005674.No ANSI-Del , PC-Del
Geremy Condra03ebf062011-10-12 18:17:24 -07005675.Xc
5676Deletes
5677.Ar n
5678characters after the cursor.
5679.It Xo delete\-word\-backward:
5680.Op Ar n
Elliott Hughes77740fc2016-08-12 15:06:53 -07005681.No Pfx1+ERASE Pq \*(ha[\*(haH ,
5682.No WERASE Pq \*(haW ,
5683.No \*(ha[\*(ha? , \*(ha[\*(haH , \*(ha[h
Geremy Condra03ebf062011-10-12 18:17:24 -07005684.Xc
5685Deletes
5686.Ar n
5687words before the cursor.
5688.It Xo delete\-word\-forward:
5689.Op Ar n
5690.No \*(ha[d
5691.Xc
5692Deletes characters after the cursor up to the end of
5693.Ar n
5694words.
5695.It Xo down\-history:
5696.Op Ar n
Elliott Hughes96b43632015-07-17 11:39:41 -07005697.No \*(haN , \*(haXB , ANSI-CurDown , PC-CurDown
Geremy Condra03ebf062011-10-12 18:17:24 -07005698.Xc
5699Scrolls the history buffer forward
5700.Ar n
5701lines (later).
5702Each input line originally starts just after the last entry
5703in the history buffer, so
5704.Ic down\-history
5705is not useful until either
5706.Ic search\-history ,
5707.Ic search\-history\-up
5708or
5709.Ic up\-history
5710has been performed.
5711.It Xo downcase\-word:
5712.Op Ar n
5713.No \*(ha[L , \*(ha[l
5714.Xc
5715Lowercases the next
5716.Ar n
5717words.
5718.It Xo edit\-line:
5719.Op Ar n
5720.No \*(haXe
5721.Xc
5722Edit line
5723.Ar n
5724or the current line, if not specified, interactively.
5725The actual command executed is
5726.Ic fc \-e ${VISUAL:\-${EDITOR:\-vi}} Ar n .
5727.It end\-of\-history: \*(ha[\*(Gt
5728Moves to the end of the history.
Elliott Hughes96b43632015-07-17 11:39:41 -07005729.It end\-of\-line: \*(haE, ANSI-End, PC-End
Geremy Condra03ebf062011-10-12 18:17:24 -07005730Moves the cursor to the end of the input line.
5731.It eot: \*(ha_
5732Acts as an end-of-file; this is useful because edit-mode input disables
Elliott Hughes77740fc2016-08-12 15:06:53 -07005733normal terminal input canonicalisation.
Geremy Condra03ebf062011-10-12 18:17:24 -07005734.It Xo eot\-or\-delete:
5735.Op Ar n
Elliott Hughes77740fc2016-08-12 15:06:53 -07005736.No EOF Pq \*(haD
Geremy Condra03ebf062011-10-12 18:17:24 -07005737.Xc
Elliott Hughes77740fc2016-08-12 15:06:53 -07005738If alone on a line, same as
5739.Ic eot ,
5740otherwise,
Geremy Condra03ebf062011-10-12 18:17:24 -07005741.Ic delete\-char\-forward .
5742.It error: (not bound)
5743Error (ring the bell).
Elliott Hughes77740fc2016-08-12 15:06:53 -07005744.It evaluate\-region: \*(ha[\*(haE
5745Evaluates the text between the mark and the cursor position
5746.Pq the entire line if no mark is set
5747as function substitution (if it cannot be parsed, the editing state is
5748unchanged and the bell is rung to signal an error); $? is updated accordingly.
Geremy Condra03ebf062011-10-12 18:17:24 -07005749.It exchange\-point\-and\-mark: \*(haX\*(haX
5750Places the cursor where the mark is and sets the mark to where the cursor was.
5751.It expand\-file: \*(ha[*
5752Appends a
5753.Ql *
5754to the current word and replaces the word with the result of performing file
5755globbing on the word.
5756If no files match the pattern, the bell is rung.
5757.It Xo forward\-char:
5758.Op Ar n
Elliott Hughes96b43632015-07-17 11:39:41 -07005759.No \*(haF , \*(haXC , ANSI-CurRight , PC-CurRight
Geremy Condra03ebf062011-10-12 18:17:24 -07005760.Xc
5761Moves the cursor forward
5762.Ar n
5763characters.
5764.It Xo forward\-word:
5765.Op Ar n
5766.No \*(ha[f , ANSI-Ctrl-CurRight , ANSI-Alt-CurRight
5767.Xc
5768Moves the cursor forward to the end of the
5769.Ar n Ns th
5770word.
5771.It Xo goto\-history:
5772.Op Ar n
5773.No \*(ha[g
5774.Xc
5775Goes to history number
5776.Ar n .
Elliott Hughes77740fc2016-08-12 15:06:53 -07005777.It Xo kill\-line:
5778.No KILL Pq \*(haU
5779.Xc
Geremy Condra03ebf062011-10-12 18:17:24 -07005780Deletes the entire input line.
5781.It kill\-region: \*(haW
5782Deletes the input between the cursor and the mark.
5783.It Xo kill\-to\-eol:
5784.Op Ar n
5785.No \*(haK
5786.Xc
5787Deletes the input from the cursor to the end of the line if
5788.Ar n
5789is not specified; otherwise deletes characters between the cursor and column
5790.Ar n .
5791.It list: \*(ha[?
5792Prints a sorted, columnated list of command names or file names (if any) that
5793can complete the partial word containing the cursor.
5794Directory names have
5795.Ql /
5796appended to them.
5797.It list\-command: \*(haX?
5798Prints a sorted, columnated list of command names (if any) that can complete
5799the partial word containing the cursor.
5800.It list\-file: \*(haX\*(haY
5801Prints a sorted, columnated list of file names (if any) that can complete the
5802partial word containing the cursor.
5803File type indicators are appended as described under
5804.Ic list
5805above.
5806.It newline: \*(haJ , \*(haM
5807Causes the current input line to be processed by the shell.
5808The current cursor position may be anywhere on the line.
5809.It newline\-and\-next: \*(haO
5810Causes the current input line to be processed by the shell, and the next line
5811from history becomes the current line.
5812This is only useful after an
5813.Ic up\-history ,
5814.Ic search\-history
5815or
5816.Ic search\-history\-up .
Elliott Hughes77740fc2016-08-12 15:06:53 -07005817.It Xo no\-op:
5818.No QUIT Pq \*(ha\e
5819.Xc
Geremy Condra03ebf062011-10-12 18:17:24 -07005820This does nothing.
5821.It prefix\-1: \*(ha[
5822Introduces a 2-character command sequence.
5823.It prefix\-2: \*(haX , \*(ha[[ , \*(ha[O
Elliott Hughes77740fc2016-08-12 15:06:53 -07005824Introduces a multi-character command sequence.
Geremy Condra03ebf062011-10-12 18:17:24 -07005825.It Xo prev\-hist\-word:
5826.Op Ar n
5827.No \*(ha[. , \*(ha[_
5828.Xc
Elliott Hughes966dd552016-12-08 15:56:04 -08005829The last word or, if given, the
Geremy Condra03ebf062011-10-12 18:17:24 -07005830.Ar n Ns th
5831word (zero-based) of the previous (on repeated execution, second-last,
5832third-last, etc.) command is inserted at the cursor.
5833Use of this editing command trashes the mark.
5834.It quote: \*(ha\*(ha , \*(haV
5835The following character is taken literally rather than as an editing command.
5836.It redraw: \*(haL
5837Reprints the last line of the prompt string and the current input line
5838on a new line.
5839.It Xo search\-character\-backward:
5840.Op Ar n
5841.No \*(ha[\*(ha]
5842.Xc
5843Search backward in the current line for the
5844.Ar n Ns th
5845occurrence of the next character typed.
5846.It Xo search\-character\-forward:
5847.Op Ar n
5848.No \*(ha]
5849.Xc
5850Search forward in the current line for the
5851.Ar n Ns th
5852occurrence of the next character typed.
5853.It search\-history: \*(haR
5854Enter incremental search mode.
5855The internal history list is searched
5856backwards for commands matching the input.
5857An initial
5858.Ql \*(ha
5859in the search string anchors the search.
5860The escape key will leave search mode.
5861Other commands, including sequences of escape as
5862.Ic prefix\-1
5863followed by a
5864.Ic prefix\-1
5865or
5866.Ic prefix\-2
5867key will be executed after leaving search mode.
5868The
5869.Ic abort Pq \*(haG
5870command will restore the input line before search started.
5871Successive
5872.Ic search\-history
5873commands continue searching backward to the next previous occurrence of the
5874pattern.
5875The history buffer retains only a finite number of lines; the oldest
5876are discarded as necessary.
Elliott Hughes96b43632015-07-17 11:39:41 -07005877.It search\-history\-up: ANSI-PgUp, PC-PgUp
Geremy Condra03ebf062011-10-12 18:17:24 -07005878Search backwards through the history buffer for commands whose beginning match
5879the portion of the input line before the cursor.
5880When used on an empty line, this has the same effect as
5881.Ic up\-history .
Elliott Hughes96b43632015-07-17 11:39:41 -07005882.It search\-history\-down: ANSI-PgDn, PC-PgDn
Geremy Condra03ebf062011-10-12 18:17:24 -07005883Search forwards through the history buffer for commands whose beginning match
5884the portion of the input line before the cursor.
5885When used on an empty line, this has the same effect as
5886.Ic down\-history .
5887This is only useful after an
5888.Ic up\-history ,
5889.Ic search\-history
5890or
5891.Ic search\-history\-up .
5892.It set\-mark\-command: \*(ha[ Ns Aq space
5893Set the mark at the cursor position.
5894.It transpose\-chars: \*(haT
Elliott Hughes966dd552016-12-08 15:56:04 -08005895If at the end of line or, if the
Geremy Condra03ebf062011-10-12 18:17:24 -07005896.Ic gmacs
5897option is set, this exchanges the two previous characters; otherwise, it
5898exchanges the previous and current characters and moves the cursor one
5899character to the right.
5900.It Xo up\-history:
5901.Op Ar n
Elliott Hughes96b43632015-07-17 11:39:41 -07005902.No \*(haP , \*(haXA , ANSI-CurUp , PC-CurUp
Geremy Condra03ebf062011-10-12 18:17:24 -07005903.Xc
5904Scrolls the history buffer backward
5905.Ar n
5906lines (earlier).
5907.It Xo upcase\-word:
5908.Op Ar n
5909.No \*(ha[U , \*(ha[u
5910.Xc
5911Uppercase the next
5912.Ar n
5913words.
5914.It version: \*(ha[\*(haV
5915Display the version of
5916.Nm mksh .
5917The current edit buffer is restored as soon as a key is pressed.
5918The restoring keypress is processed, unless it is a space.
5919.It yank: \*(haY
5920Inserts the most recently killed text string at the current cursor position.
5921.It yank\-pop: \*(ha[y
5922Immediately after a
5923.Ic yank ,
5924replaces the inserted text string with the next previously killed text string.
5925.El
Elliott Hughes77740fc2016-08-12 15:06:53 -07005926.Pp
5927The tab completion escapes characters the same way as the following code:
5928.Bd -literal
5929print \-nr \-\- "${x@/[\e"\-\e$\e&\-*:\-?[\e\e\e\`{\-\e}${IFS\-$\*(aq \et\en\*(aq}]/\e\e$KSH_MATCH}"
5930.Ed
Geremy Condra03ebf062011-10-12 18:17:24 -07005931.Ss Vi editing mode
5932.Em Note:
5933The vi command-line editing mode is orphaned, yet still functional.
Elliott Hughes737fdce2014-08-07 12:59:26 -07005934It is 8-bit clean but specifically does not support UTF-8 or MBCS.
Geremy Condra03ebf062011-10-12 18:17:24 -07005935.Pp
5936The vi command-line editor in
5937.Nm
5938has basically the same commands as the
5939.Xr vi 1
5940editor with the following exceptions:
5941.Bl -bullet
5942.It
5943You start out in insert mode.
5944.It
5945There are file name and command completion commands:
Elliott Hughes966dd552016-12-08 15:56:04 -08005946=, \e, *, \*(haX, \*(haE, \*(haF and, optionally,
Geremy Condra03ebf062011-10-12 18:17:24 -07005947.Aq tab
5948and
5949.Aq esc .
5950.It
5951The
5952.Ic _
5953command is different (in
5954.Nm mksh ,
5955it is the last argument command; in
5956.Xr vi 1
5957it goes to the start of the current line).
5958.It
5959The
5960.Ic /
5961and
5962.Ic G
5963commands move in the opposite direction to the
5964.Ic j
5965command.
5966.It
5967Commands which don't make sense in a single line editor are not available
5968(e.g. screen movement commands and
5969.Xr ex 1 Ns -style
5970colon
5971.Pq Ic \&:
5972commands).
5973.El
5974.Pp
5975Like
5976.Xr vi 1 ,
5977there are two modes:
5978.Dq insert
5979mode and
5980.Dq command
5981mode.
5982In insert mode, most characters are simply put in the buffer at the
5983current cursor position as they are typed; however, some characters are
5984treated specially.
5985In particular, the following characters are taken from current
5986.Xr tty 4
5987settings
5988(see
5989.Xr stty 1 )
5990and have their usual meaning (normal values are in parentheses): kill (\*(haU),
Elliott Hughes966dd552016-12-08 15:56:04 -08005991erase (\*(ha?), werase (\*(haW), eof (\*(haD), intr (\*(haC) and quit (\*(ha\e).
Geremy Condra03ebf062011-10-12 18:17:24 -07005992In addition to
5993the above, the following characters are also treated specially in insert mode:
5994.Bl -tag -width XJXXXXM
5995.It \*(haE
5996Command and file name enumeration (see below).
5997.It \*(haF
5998Command and file name completion (see below).
5999If used twice in a row, the
6000list of possible completions is displayed; if used a third time, the completion
6001is undone.
6002.It \*(haH
6003Erases previous character.
6004.It \*(haJ \*(Ba \*(haM
6005End of line.
Elliott Hughes966dd552016-12-08 15:56:04 -08006006The current line is read, parsed and executed by the shell.
Geremy Condra03ebf062011-10-12 18:17:24 -07006007.It \*(haV
6008Literal next.
6009The next character typed is not treated specially (can be used
6010to insert the characters being described here).
6011.It \*(haX
6012Command and file name expansion (see below).
6013.It Aq esc
6014Puts the editor in command mode (see below).
6015.It Aq tab
6016Optional file name and command completion (see
6017.Ic \*(haF
6018above), enabled with
Elliott Hughes96b43632015-07-17 11:39:41 -07006019.Ic set Fl o Ic vi\-tabcomplete .
Geremy Condra03ebf062011-10-12 18:17:24 -07006020.El
6021.Pp
6022In command mode, each character is interpreted as a command.
6023Characters that
6024don't correspond to commands, are illegal combinations of commands, or are
6025commands that can't be carried out, all cause beeps.
6026In the following command descriptions, an
6027.Op Ar n
6028indicates the command may be prefixed by a number (e.g.\&
6029.Ic 10l
6030moves right 10 characters); if no number prefix is used,
6031.Ar n
6032is assumed to be 1 unless otherwise specified.
6033The term
6034.Dq current position
6035refers to the position between the cursor and the character preceding the
6036cursor.
6037A
6038.Dq word
Elliott Hughes966dd552016-12-08 15:56:04 -08006039is a sequence of letters, digits and underscore characters or a sequence of
6040non-letter, non-digit, non-underscore and non-whitespace characters (e.g.\&
6041.Dq Li ab2*&\*(ha
Geremy Condra03ebf062011-10-12 18:17:24 -07006042contains two words) and a
6043.Dq big-word
6044is a sequence of non-whitespace characters.
6045.Pp
6046Special
6047.Nm
6048vi commands:
6049.Pp
6050The following commands are not in, or are different from, the normal vi file
6051editor:
6052.Bl -tag -width 10n
6053.It Xo
6054.Oo Ar n Oc Ns _
6055.Xc
6056Insert a space followed by the
6057.Ar n Ns th
6058big-word from the last command in the history at the current position and enter
6059insert mode; if
6060.Ar n
6061is not specified, the last word is inserted.
6062.It #
6063Insert the comment character
Elliott Hughes966dd552016-12-08 15:56:04 -08006064.Pq Ql #
Geremy Condra03ebf062011-10-12 18:17:24 -07006065at the start of the current line and return the line to the shell (equivalent
6066to
6067.Ic I#\*(haJ ) .
6068.It Xo
6069.Oo Ar n Oc Ns g
6070.Xc
6071Like
6072.Ic G ,
6073except if
6074.Ar n
6075is not specified, it goes to the most recent remembered line.
6076.It Xo
6077.Oo Ar n Oc Ns v
6078.Xc
6079Edit line
6080.Ar n
6081using the
6082.Xr vi 1
6083editor; if
6084.Ar n
6085is not specified, the current line is edited.
6086The actual command executed is
6087.Ic fc \-e ${VISUAL:\-${EDITOR:\-vi}} Ar n .
6088.It * and \*(haX
6089Command or file name expansion is applied to the current big-word (with an
6090appended
6091.Ql *
6092if the word contains no file globbing characters) \*(en the big-word is replaced
6093with the resulting words.
6094If the current big-word is the first on the line
6095or follows one of the characters
6096.Ql \&; ,
6097.Ql \*(Ba ,
6098.Ql & ,
Elliott Hughes966dd552016-12-08 15:56:04 -08006099.Ql \&(
Geremy Condra03ebf062011-10-12 18:17:24 -07006100or
Elliott Hughes966dd552016-12-08 15:56:04 -08006101.Ql \&)
Geremy Condra03ebf062011-10-12 18:17:24 -07006102and does not contain a slash
Elliott Hughes966dd552016-12-08 15:56:04 -08006103.Pq Ql / ,
Geremy Condra03ebf062011-10-12 18:17:24 -07006104then command expansion is done; otherwise file name expansion is done.
Elliott Hughes966dd552016-12-08 15:56:04 -08006105Command expansion will match the big-word against all aliases, functions and
Geremy Condra03ebf062011-10-12 18:17:24 -07006106built-in commands as well as any executable files found by searching the
6107directories in the
6108.Ev PATH
6109parameter.
6110File name expansion matches the big-word against the files in the
6111current directory.
6112After expansion, the cursor is placed just past the last
6113word and the editor is in insert mode.
6114.It Xo
6115.Oo Ar n Oc Ns \e ,
6116.Oo Ar n Oc Ns \*(haF ,
6117.Oo Ar n Oc Ns Aq tab ,
6118.No and
6119.Oo Ar n Oc Ns Aq esc
6120.Xc
6121Command/file name completion.
6122Replace the current big-word with the
6123longest unique match obtained after performing command and file name expansion.
6124.Aq tab
6125is only recognised if the
6126.Ic vi\-tabcomplete
6127option is set, while
6128.Aq esc
6129is only recognised if the
6130.Ic vi\-esccomplete
6131option is set (see
Elliott Hughes96b43632015-07-17 11:39:41 -07006132.Ic set Fl o ) .
Geremy Condra03ebf062011-10-12 18:17:24 -07006133If
6134.Ar n
6135is specified, the
6136.Ar n Ns th
6137possible completion is selected (as reported by the command/file name
6138enumeration command).
6139.It = and \*(haE
6140Command/file name enumeration.
6141List all the commands or files that match the current big-word.
6142.It \*(haV
6143Display the version of
6144.Nm mksh .
6145The current edit buffer is restored as soon as a key is pressed.
6146The restoring keypress is ignored.
6147.It @ Ns Ar c
6148Macro expansion.
6149Execute the commands found in the alias
6150.Ar c .
6151.El
6152.Pp
6153Intra-line movement commands:
6154.Bl -tag -width Ds
6155.It Xo
6156.Oo Ar n Oc Ns h and
6157.Oo Ar n Oc Ns \*(haH
6158.Xc
6159Move left
6160.Ar n
6161characters.
6162.It Xo
6163.Oo Ar n Oc Ns l and
6164.Oo Ar n Oc Ns Aq space
6165.Xc
6166Move right
6167.Ar n
6168characters.
6169.It 0
6170Move to column 0.
6171.It \*(ha
6172Move to the first non-whitespace character.
6173.It Xo
6174.Oo Ar n Oc Ns \*(Ba
6175.Xc
6176Move to column
6177.Ar n .
6178.It $
6179Move to the last character.
6180.It Xo
6181.Oo Ar n Oc Ns b
6182.Xc
6183Move back
6184.Ar n
6185words.
6186.It Xo
6187.Oo Ar n Oc Ns B
6188.Xc
6189Move back
6190.Ar n
6191big-words.
6192.It Xo
6193.Oo Ar n Oc Ns e
6194.Xc
6195Move forward to the end of the word,
6196.Ar n
6197times.
6198.It Xo
6199.Oo Ar n Oc Ns E
6200.Xc
6201Move forward to the end of the big-word,
6202.Ar n
6203times.
6204.It Xo
6205.Oo Ar n Oc Ns w
6206.Xc
6207Move forward
6208.Ar n
6209words.
6210.It Xo
6211.Oo Ar n Oc Ns W
6212.Xc
6213Move forward
6214.Ar n
6215big-words.
6216.It %
6217Find match.
Elliott Hughes966dd552016-12-08 15:56:04 -08006218The editor looks forward for the nearest parenthesis, bracket or
6219brace and then moves the cursor to the matching parenthesis, bracket or brace.
Geremy Condra03ebf062011-10-12 18:17:24 -07006220.It Xo
6221.Oo Ar n Oc Ns f Ns Ar c
6222.Xc
6223Move forward to the
6224.Ar n Ns th
6225occurrence of the character
6226.Ar c .
6227.It Xo
6228.Oo Ar n Oc Ns F Ns Ar c
6229.Xc
6230Move backward to the
6231.Ar n Ns th
6232occurrence of the character
6233.Ar c .
6234.It Xo
6235.Oo Ar n Oc Ns t Ns Ar c
6236.Xc
6237Move forward to just before the
6238.Ar n Ns th
6239occurrence of the character
6240.Ar c .
6241.It Xo
6242.Oo Ar n Oc Ns T Ns Ar c
6243.Xc
6244Move backward to just before the
6245.Ar n Ns th
6246occurrence of the character
6247.Ar c .
6248.It Xo
6249.Oo Ar n Oc Ns \&;
6250.Xc
6251Repeats the last
Elliott Hughes966dd552016-12-08 15:56:04 -08006252.Ic f , F , t
Geremy Condra03ebf062011-10-12 18:17:24 -07006253or
6254.Ic T
6255command.
6256.It Xo
6257.Oo Ar n Oc Ns \&,
6258.Xc
6259Repeats the last
Elliott Hughes966dd552016-12-08 15:56:04 -08006260.Ic f , F , t
Geremy Condra03ebf062011-10-12 18:17:24 -07006261or
6262.Ic T
6263command, but moves in the opposite direction.
6264.El
6265.Pp
6266Inter-line movement commands:
6267.Bl -tag -width Ds
6268.It Xo
6269.Oo Ar n Oc Ns j ,
6270.Oo Ar n Oc Ns + ,
6271.No and
6272.Oo Ar n Oc Ns \*(haN
6273.Xc
6274Move to the
6275.Ar n Ns th
6276next line in the history.
6277.It Xo
6278.Oo Ar n Oc Ns k ,
6279.Oo Ar n Oc Ns \- ,
6280.No and
6281.Oo Ar n Oc Ns \*(haP
6282.Xc
6283Move to the
6284.Ar n Ns th
6285previous line in the history.
6286.It Xo
6287.Oo Ar n Oc Ns G
6288.Xc
6289Move to line
6290.Ar n
6291in the history; if
6292.Ar n
6293is not specified, the number of the first remembered line is used.
6294.It Xo
6295.Oo Ar n Oc Ns g
6296.Xc
6297Like
6298.Ic G ,
6299except if
6300.Ar n
6301is not specified, it goes to the most recent remembered line.
6302.It Xo
6303.Oo Ar n Oc Ns / Ns Ar string
6304.Xc
6305Search backward through the history for the
6306.Ar n Ns th
6307line containing
6308.Ar string ;
6309if
6310.Ar string
6311starts with
6312.Ql \*(ha ,
6313the remainder of the string must appear at the start of the history line for
6314it to match.
6315.It Xo
6316.Oo Ar n Oc Ns \&? Ns Ar string
6317.Xc
6318Same as
6319.Ic / ,
6320except it searches forward through the history.
6321.It Xo
6322.Oo Ar n Oc Ns n
6323.Xc
6324Search for the
6325.Ar n Ns th
6326occurrence of the last search string;
6327the direction of the search is the same as the last search.
6328.It Xo
6329.Oo Ar n Oc Ns N
6330.Xc
6331Search for the
6332.Ar n Ns th
6333occurrence of the last search string;
6334the direction of the search is the opposite of the last search.
Elliott Hughes96b43632015-07-17 11:39:41 -07006335.It Ar ANSI-CurUp , PC-PgUp
Thorsten Glaser811a5752013-07-25 14:24:45 +00006336Take the characters from the beginning of the line to the current
6337cursor position as search string and do a backwards history search
6338for lines beginning with this string; keep the cursor position.
6339This works only in insert mode and keeps it enabled.
Geremy Condra03ebf062011-10-12 18:17:24 -07006340.El
6341.Pp
6342Edit commands
6343.Bl -tag -width Ds
6344.It Xo
6345.Oo Ar n Oc Ns a
6346.Xc
6347Append text
6348.Ar n
6349times; goes into insert mode just after the current position.
6350The append is
6351only replicated if command mode is re-entered i.e.\&
6352.Aq esc
6353is used.
6354.It Xo
6355.Oo Ar n Oc Ns A
6356.Xc
6357Same as
6358.Ic a ,
6359except it appends at the end of the line.
6360.It Xo
6361.Oo Ar n Oc Ns i
6362.Xc
6363Insert text
6364.Ar n
6365times; goes into insert mode at the current position.
6366The insertion is only
6367replicated if command mode is re-entered i.e.\&
6368.Aq esc
6369is used.
6370.It Xo
6371.Oo Ar n Oc Ns I
6372.Xc
6373Same as
6374.Ic i ,
6375except the insertion is done just before the first non-blank character.
6376.It Xo
6377.Oo Ar n Oc Ns s
6378.Xc
6379Substitute the next
6380.Ar n
6381characters (i.e. delete the characters and go into insert mode).
6382.It S
6383Substitute whole line.
6384All characters from the first non-blank character to the
6385end of the line are deleted and insert mode is entered.
6386.It Xo
6387.Oo Ar n Oc Ns c Ns Ar move-cmd
6388.Xc
6389Change from the current position to the position resulting from
6390.Ar n move-cmd Ns s
6391(i.e. delete the indicated region and go into insert mode); if
6392.Ar move-cmd
6393is
6394.Ic c ,
6395the line starting from the first non-blank character is changed.
6396.It C
6397Change from the current position to the end of the line (i.e. delete to the
6398end of the line and go into insert mode).
6399.It Xo
6400.Oo Ar n Oc Ns x
6401.Xc
6402Delete the next
6403.Ar n
6404characters.
6405.It Xo
6406.Oo Ar n Oc Ns X
6407.Xc
6408Delete the previous
6409.Ar n
6410characters.
6411.It D
6412Delete to the end of the line.
6413.It Xo
6414.Oo Ar n Oc Ns d Ns Ar move-cmd
6415.Xc
6416Delete from the current position to the position resulting from
6417.Ar n move-cmd Ns s ;
6418.Ar move-cmd
6419is a movement command (see above) or
6420.Ic d ,
6421in which case the current line is deleted.
6422.It Xo
6423.Oo Ar n Oc Ns r Ns Ar c
6424.Xc
6425Replace the next
6426.Ar n
6427characters with the character
6428.Ar c .
6429.It Xo
6430.Oo Ar n Oc Ns R
6431.Xc
6432Replace.
6433Enter insert mode but overwrite existing characters instead of
6434inserting before existing characters.
6435The replacement is repeated
6436.Ar n
6437times.
6438.It Xo
6439.Oo Ar n Oc Ns \*(TI
6440.Xc
6441Change the case of the next
6442.Ar n
6443characters.
6444.It Xo
6445.Oo Ar n Oc Ns y Ns Ar move-cmd
6446.Xc
6447Yank from the current position to the position resulting from
6448.Ar n move-cmd Ns s
6449into the yank buffer; if
6450.Ar move-cmd
6451is
6452.Ic y ,
6453the whole line is yanked.
6454.It Y
6455Yank from the current position to the end of the line.
6456.It Xo
6457.Oo Ar n Oc Ns p
6458.Xc
6459Paste the contents of the yank buffer just after the current position,
6460.Ar n
6461times.
6462.It Xo
6463.Oo Ar n Oc Ns P
6464.Xc
6465Same as
6466.Ic p ,
6467except the buffer is pasted at the current position.
6468.El
6469.Pp
6470Miscellaneous vi commands
6471.Bl -tag -width Ds
6472.It \*(haJ and \*(haM
Elliott Hughes966dd552016-12-08 15:56:04 -08006473The current line is read, parsed and executed by the shell.
Geremy Condra03ebf062011-10-12 18:17:24 -07006474.It \*(haL and \*(haR
6475Redraw the current line.
6476.It Xo
6477.Oo Ar n Oc Ns \&.
6478.Xc
6479Redo the last edit command
6480.Ar n
6481times.
6482.It u
6483Undo the last edit command.
6484.It U
6485Undo all changes that have been made to the current line.
Elliott Hughes966dd552016-12-08 15:56:04 -08006486.It PC Home, End, Del and cursor keys
Elliott Hughes96b43632015-07-17 11:39:41 -07006487They move as expected, both in insert and command mode.
Geremy Condra03ebf062011-10-12 18:17:24 -07006488.It Ar intr No and Ar quit
6489The interrupt and quit terminal characters cause the current line to be
Elliott Hughes23925bb2017-09-22 16:04:20 -07006490removed to the history and a new prompt to be printed.
Geremy Condra03ebf062011-10-12 18:17:24 -07006491.El
6492.Sh FILES
6493.Bl -tag -width XetcXsuid_profile -compact
6494.It Pa \*(TI/.mkshrc
6495User mkshrc profile (non-privileged interactive shells); see
6496.Sx Startup files.
6497The location can be changed at compile time (for embedded systems);
6498AOSP Android builds use
6499.Pa /system/etc/mkshrc .
6500.It Pa \*(TI/.profile
6501User profile (non-privileged login shells); see
6502.Sx Startup files
6503near the top of this manual.
6504.It Pa /etc/profile
6505System profile (login shells); see
6506.Sx Startup files.
6507.It Pa /etc/shells
6508Shell database.
6509.It Pa /etc/suid_profile
6510Suid profile (privileged shells); see
6511.Sx Startup files.
6512.El
6513.Pp
6514Note: On Android,
6515.Pa /system/etc/
6516contains the system and suid profile.
6517.Sh SEE ALSO
6518.Xr awk 1 ,
6519.Xr cat 1 ,
6520.Xr ed 1 ,
6521.Xr getopt 1 ,
Elliott Hughesfc0307d2016-02-02 15:26:47 -08006522.Xr lksh 1 ,
Geremy Condra03ebf062011-10-12 18:17:24 -07006523.Xr sed 1 ,
6524.Xr sh 1 ,
6525.Xr stty 1 ,
6526.Xr dup 2 ,
6527.Xr execve 2 ,
6528.Xr getgid 2 ,
6529.Xr getuid 2 ,
6530.Xr mknod 2 ,
6531.Xr mkfifo 2 ,
6532.Xr open 2 ,
6533.Xr pipe 2 ,
6534.Xr rename 2 ,
6535.Xr wait 2 ,
6536.Xr getopt 3 ,
6537.Xr nl_langinfo 3 ,
6538.Xr setlocale 3 ,
6539.Xr signal 3 ,
6540.Xr system 3 ,
6541.Xr tty 4 ,
6542.Xr shells 5 ,
6543.Xr environ 7 ,
6544.Xr script 7 ,
6545.Xr utf\-8 7 ,
6546.Xr mknod 8
6547.Pp
Elliott Hughesa3c3f962017-04-12 16:52:30 -07006548.Pa http://www.mirbsd.org/ksh\-chan.htm
Geremy Condra03ebf062011-10-12 18:17:24 -07006549.Rs
6550.%A Morris Bolsky
6551.%B "The KornShell Command and Programming Language"
6552.%D 1989
6553.%I "Prentice Hall PTR"
6554.%P "xvi\ +\ 356 pages"
6555.%O "ISBN 978\-0\-13\-516972\-8 (0\-13\-516972\-0)"
6556.Re
6557.Rs
6558.%A Morris I. Bolsky
6559.%A David G. Korn
6560.%B "The New KornShell Command and Programming Language (2nd Edition)"
6561.%D 1995
6562.%I "Prentice Hall PTR"
6563.%P "xvi\ +\ 400 pages"
6564.%O "ISBN 978\-0\-13\-182700\-4 (0\-13\-182700\-6)"
6565.Re
6566.Rs
6567.%A Stephen G. Kochan
6568.%A Patrick H. Wood
6569.%B "\\*(tNUNIX\\*(sP Shell Programming"
Elliott Hughes737fdce2014-08-07 12:59:26 -07006570.%V "3rd Edition"
6571.%D 2003
6572.%I "Sams"
6573.%P "xiii\ +\ 437 pages"
6574.%O "ISBN 978\-0\-672\-32490\-1 (0\-672\-32490\-3)"
Geremy Condra03ebf062011-10-12 18:17:24 -07006575.Re
6576.Rs
6577.%A "IEEE Inc."
Elliott Hughes737fdce2014-08-07 12:59:26 -07006578.%T "\\*(tNIEEE\\*(sP Standard for Information Technology \*(en Portable Operating System Interface (POSIX)"
Geremy Condra03ebf062011-10-12 18:17:24 -07006579.%V "Part 2: Shell and Utilities"
6580.%D 1993
6581.%I "IEEE Press"
6582.%P "xvii\ +\ 1195 pages"
6583.%O "ISBN 978\-1\-55937\-255\-8 (1\-55937\-255\-9)"
6584.Re
6585.Rs
6586.%A Bill Rosenblatt
6587.%B "Learning the Korn Shell"
6588.%D 1993
6589.%I "O'Reilly"
6590.%P "360 pages"
6591.%O "ISBN 978\-1\-56592\-054\-5 (1\-56592\-054\-6)"
6592.Re
6593.Rs
6594.%A Bill Rosenblatt
6595.%A Arnold Robbins
6596.%B "Learning the Korn Shell, Second Edition"
6597.%D 2002
6598.%I "O'Reilly"
6599.%P "432 pages"
6600.%O "ISBN 978\-0\-596\-00195\-7 (0\-596\-00195\-9)"
6601.Re
6602.Rs
6603.%A Barry Rosenberg
6604.%B "KornShell Programming Tutorial"
6605.%D 1991
6606.%I "Addison-Wesley Professional"
6607.%P "xxi\ +\ 324 pages"
6608.%O "ISBN 978\-0\-201\-56324\-5 (0\-201\-56324\-X)"
6609.Re
6610.Sh AUTHORS
Elliott Hughes737fdce2014-08-07 12:59:26 -07006611.An -nosplit
Geremy Condra03ebf062011-10-12 18:17:24 -07006612.Nm "The MirBSD Korn Shell"
6613is developed by
Elliott Hughesfc0307d2016-02-02 15:26:47 -08006614.An mirabilos Aq Mt m@mirbsd.org
6615as part of The MirOS Project.
Elliott Hughes737fdce2014-08-07 12:59:26 -07006616This shell is based on the public domain 7th edition Bourne shell clone by
6617.An Charles Forsyth ,
6618who kindly agreed to, in countries where the Public Domain status of the work
6619may not be valid, grant a copyright licence to the general public to deal in
Elliott Hughes966dd552016-12-08 15:56:04 -08006620the work without restriction and permission to sublicence derivatives under
6621the terms of any (OSI approved) Open Source licence,
Elliott Hughes737fdce2014-08-07 12:59:26 -07006622and parts of the BRL shell by
6623.An Doug A. Gwyn ,
6624.An Doug Kingston ,
6625.An Ron Natalie ,
6626.An Arnold Robbins ,
Elliott Hughes966dd552016-12-08 15:56:04 -08006627.An Lou Salkind
Elliott Hughes737fdce2014-08-07 12:59:26 -07006628and others.
6629The first release of
6630.Nm pdksh
6631was created by
6632.An Eric Gisin ,
6633and it was subsequently maintained by
Elliott Hughesfc0307d2016-02-02 15:26:47 -08006634.An John R. MacMillan ,
Elliott Hughes966dd552016-12-08 15:56:04 -08006635.An Simon J. Gerraty
Elliott Hughes737fdce2014-08-07 12:59:26 -07006636and
Elliott Hughesfc0307d2016-02-02 15:26:47 -08006637.An Michael Rendell .
Elliott Hughes737fdce2014-08-07 12:59:26 -07006638The effort of several projects, such as Debian and OpenBSD, and other
6639contributors including our users, to improve the shell is appreciated.
Elliott Hughes23925bb2017-09-22 16:04:20 -07006640See the documentation, website and source code (CVS) for details.
Thorsten Glaser811a5752013-07-25 14:24:45 +00006641.Pp
Elliott Hughesa3c3f962017-04-12 16:52:30 -07006642.Nm mksh\-os2
6643is developed by
6644.An KO Myung-Hun Aq Mt komh@chollian.net .
6645.Pp
6646.Nm mksh\-w32
6647is developed by
6648.An Michael Langguth Aq Mt lan@scalaris.com .
6649.Pp
Elliott Hughes23925bb2017-09-22 16:04:20 -07006650.Nm mksh Ns / Ns Tn z/OS
6651is contributed by
6652.An Daniel Richard G. Aq Mt skunk@iSKUNK.ORG .
6653.Pp
Thorsten Glaser811a5752013-07-25 14:24:45 +00006654The BSD daemon is Copyright \(co Marshall Kirk McKusick.
6655The complete legalese is at:
Elliott Hughesa3c3f962017-04-12 16:52:30 -07006656.Pa http://www.mirbsd.org/TaC\-mksh.txt
Thorsten Glaser811a5752013-07-25 14:24:45 +00006657.\"
6658.\" This boils down to: feel free to use mksh.ico as application icon
Elliott Hughesfc0307d2016-02-02 15:26:47 -08006659.\" or shortcut for mksh or mksh/Win32 or OS/2; distro patches are ok
6660.\" (but we request they amend $KSH_VERSION when modifying mksh).
6661.\" Authors are Marshall Kirk McKusick (UCB), Rick Collette (ekkoBSD),
6662.\" mirabilos, Benny Siegert (MirBSD), Michael Langguth (mksh/Win32),
6663.\" KO Myung-Hun (mksh for OS/2).
Thorsten Glaser811a5752013-07-25 14:24:45 +00006664.\"
6665.\" As far as MirBSD is concerned, the files themselves are free
6666.\" to modification and distribution under BSD/MirOS Licence, the
6667.\" restriction on use stems only from trademark law's requirement
6668.\" to protect it or lose it, which McKusick almost did.
6669.\"
Geremy Condra03ebf062011-10-12 18:17:24 -07006670.Sh CAVEATS
Thorsten Glaser811a5752013-07-25 14:24:45 +00006671.Nm mksh
Elliott Hughes966dd552016-12-08 15:56:04 -08006672provides a consistent 32-bit integer arithmetic implementation, both
6673signed and unsigned, with sign of the result of a remainder operation
6674and wraparound defined, even (defying POSIX) on 36-bit and 64-bit systems.
Elliott Hughes50012062015-03-10 22:22:24 -07006675.Pp
6676.Nm mksh
6677provides a consistent, clear interface normally.
Elliott Hughesfc0307d2016-02-02 15:26:47 -08006678This may deviate from POSIX in historic or opinionated places.
Elliott Hughes96b43632015-07-17 11:39:41 -07006679.Ic set Fl o Ic posix
Elliott Hughesfc0307d2016-02-02 15:26:47 -08006680(see
6681.Sx POSIX mode
6682for details)
6683will cause the shell to behave more conformant.
Elliott Hughesb27ce952015-04-21 13:39:18 -07006684.Pp
6685For the purpose of
6686.Tn POSIX ,
6687.Nm mksh
6688supports only the
6689.Dq C
6690locale.
Elliott Hughes96b43632015-07-17 11:39:41 -07006691.Nm mksh Ns 's
6692.Ic utf8\-mode
Elliott Hughes23925bb2017-09-22 16:04:20 -07006693.Em must
6694be disabled in POSIX mode, and it
Elliott Hughes47086262019-03-26 12:34:31 -07006695only supports the BMP (Basic Multilingual Plane) of UCS and maps
Elliott Hughes96b43632015-07-17 11:39:41 -07006696raw octets into the U+EF80..U+EFFF wide character range; compare
6697.Sx Arithmetic expressions .
6698The following
6699.Tn POSIX
Elliott Hughes23925bb2017-09-22 16:04:20 -07006700.Nm sh Ns -compatible
Elliott Hughes96b43632015-07-17 11:39:41 -07006701code toggles the
6702.Ic utf8\-mode
6703option dependent on the current
6704.Tn POSIX
6705locale for mksh to allow using the UTF-8 mode, within the constraints
6706outlined above, in code portable across various shell implementations:
Elliott Hughesb27ce952015-04-21 13:39:18 -07006707.Bd -literal -offset indent
6708case ${KSH_VERSION:\-} in
6709*MIRBSD\ KSH*\*(Ba*LEGACY\ KSH*)
6710 case ${LC_ALL:\-${LC_CTYPE:\-${LANG:\-}}} in
6711 *[Uu][Tt][Ff]8*\*(Ba*[Uu][Tt][Ff]\-8*) set \-U ;;
6712 *) set +U ;;
6713 esac ;;
6714esac
6715.Ed
Elliott Hughes47086262019-03-26 12:34:31 -07006716In near future, (UTF-8) locale tracking will be implemented though.
6717.Pp
6718Using
6719.Ic set Fl o Ic pipefail
6720makes the following construct error out:
6721.Bd -literal -offset indent
6722set -e
6723for x in 1 2; do
6724 false && echo $x
6725done \*(Ba cat
6726.Ed
6727This is because, while the
6728.Dq Li &&\&
6729ensures that the inner command's failure is not taken, it sets
6730the entire for..done loop's errorlevel, which is passed on by
6731.Fl o Ic pipefail .
6732Invert the inner command:
6733.Li true \*(Ba\*(Ba echo $x
Elliott Hughesa3c3f962017-04-12 16:52:30 -07006734.Pp
6735See also the FAQ below.
Geremy Condra03ebf062011-10-12 18:17:24 -07006736.Sh BUGS
6737Suspending (using \*(haZ) pipelines like the one below will only suspend
6738the currently running part of the pipeline; in this example,
Elliott Hughes966dd552016-12-08 15:56:04 -08006739.Dq Li fubar
Geremy Condra03ebf062011-10-12 18:17:24 -07006740is immediately printed on suspension (but not later after an
6741.Ic fg ) .
6742.Bd -literal -offset indent
6743$ /bin/sleep 666 && echo fubar
6744.Ed
6745.Pp
Elliott Hughesb27ce952015-04-21 13:39:18 -07006746The truncation process involved when changing
6747.Ev HISTFILE
6748does not free old history entries (leaks memory) and leaks
6749old entries into the new history if their line numbers are
Elliott Hughes966dd552016-12-08 15:56:04 -08006750not overwritten by same-number entries from the persistent
Elliott Hughesb27ce952015-04-21 13:39:18 -07006751history file; truncating the on-disc file to
6752.Ev HISTSIZE
6753lines has always been broken and prone to history file corruption
6754when multiple shells are accessing the file; the rollover process
6755for the in-memory portion of the history is slow, should use
6756.Xr memmove 3 .
6757.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07006758This document attempts to describe
Elliott Hughes47086262019-03-26 12:34:31 -07006759.Nm mksh\ R57
Geremy Condra03ebf062011-10-12 18:17:24 -07006760and up,
Elliott Hughesb27ce952015-04-21 13:39:18 -07006761.\" with vendor patches from insert-your-name-here,
Geremy Condra03ebf062011-10-12 18:17:24 -07006762compiled without any options impacting functionality, such as
6763.Dv MKSH_SMALL ,
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00006764when not called as
6765.Pa /bin/sh
6766which, on some systems only, enables
Elliott Hughes96b43632015-07-17 11:39:41 -07006767.Ic set Fl o Ic posix
Elliott Hughes50012062015-03-10 22:22:24 -07006768or
Elliott Hughes96b43632015-07-17 11:39:41 -07006769.Ic set Fl o Ic sh
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00006770automatically (whose behaviour differs across targets),
Geremy Condra03ebf062011-10-12 18:17:24 -07006771for an operating environment supporting all of its advanced needs.
Elliott Hughes50012062015-03-10 22:22:24 -07006772.Pp
Geremy Condra03ebf062011-10-12 18:17:24 -07006773Please report bugs in
6774.Nm
Elliott Hughes47086262019-03-26 12:34:31 -07006775to the public development mailing list at
Elliott Hughesfc0307d2016-02-02 15:26:47 -08006776.Aq Mt miros\-mksh@mirbsd.org
Elliott Hughes47086262019-03-26 12:34:31 -07006777(please note the EU-DSGVO/GDPR notice on
6778.Pa http://www.mirbsd.org/rss.htm#lists
6779and in the SMTP banner!) or in the
Geremy Condra03ebf062011-10-12 18:17:24 -07006780.Li \&#\&!/bin/mksh
6781.Pq or Li \&#ksh
6782IRC channel at
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00006783.Pa irc.freenode.net
6784.Pq Port 6697 SSL, 6667 unencrypted ,
6785or at:
6786.Pa https://launchpad.net/mksh
Elliott Hughesa3c3f962017-04-12 16:52:30 -07006787.Sh FREQUENTLY ASKED QUESTIONS
6788This FAQ attempts to document some of the questions users of
6789.Nm
6790or readers of this manual page may encounter.
6791.Ss I'm an Android user, so what's mksh?
6792.Nm mksh
6793is a
6794.Ux
6795shell / command interpreter, similar to
6796.Nm COMMAND.COM
6797or
6798.Nm CMD.EXE ,
6799which has been included with
6800.Tn Android Open Source Project
6801for a while now.
6802Basically, it's a program that runs in a terminal (console window),
6803takes user input and runs commands or scripts, which it can also
6804be asked to do by other programs, even in the background.
6805Any privilege pop-ups you might be encountering are thus not
6806.Nm mksh
6807issues but questions by some other program utilising it.
6808.Ss "I'm an OS/2 user, what do I need to know?"
6809Unlike the native command prompt, the current working directory is,
6810for security reasons common on Unix systems which the shell is designed for,
6811not in the search path at all; if you really need this, run the command
6812.Li PATH=.$PATHSEP$PATH
6813or add that to a suitable initialisation file.
6814.Pp
6815There are two different newline modes for mksh-os2: standard (Unix) mode,
6816in which only LF (0A hex) is supported as line separator, and "textmode",
6817which also accepts ASCII newlines (CR+LF), like most other tools on OS/2,
6818but creating an incompatibility with standard
6819.Nm .
6820If you compiled mksh from source, you will get the standard Unix mode unless
6821.Fl T
6822is added during compilation; you will most likely have gotten this shell
6823through komh's port on Hobbes, or from his OS/2 Factory on eComStation
6824Korea, which uses "textmode", though.
6825Most OS/2 users will want to use "textmode" unless they need absolute
6826compatibility with Unix
6827.Nm .
6828.Ss "How do I start mksh on a specific terminal?"
6829Normally:
6830.Dl mksh \-T/dev/tty2
6831.Pp
6832However, if you want for it to return (e.g. for an embedded
6833system rescue shell), use this on your real console device instead:
6834.Dl mksh \-T!/dev/ttyACM0
6835.Pp
6836.Nm
6837can also daemonise (send to the background):
6838.Dl mksh \-T\- \-c \*(aqexec cdio lock\*(aq
6839.Ss "POSIX says..."
6840Run the shell in POSIX mode (and possibly
6841.Nm lksh
6842instead of
6843.Nm mksh ) :
6844.Dl set \-o posix
Elliott Hughes47086262019-03-26 12:34:31 -07006845.Ss "I forbid stat(2) in my SELinux policy, and some things do not work!"
6846Don't break Unix.
6847Read up on the GIGO principle.
6848Duh.
Elliott Hughesa3c3f962017-04-12 16:52:30 -07006849.Ss "My prompt from <some other shell> does not work!"
6850Contact us on the mailing list or on IRC, we'll convert it for you.
6851.Ss "Something is going wrong with my while...read loop"
6852Most likely, you've encountered the problem in which the shell runs
6853all parts of a pipeline as subshell.
6854The inner loop will be executed in a subshell and variable changes
6855cannot be propagated if run in a pipeline:
6856.Bd -literal -offset indent
6857bar \*(Ba baz \*(Ba while read foo; do ...; done
6858.Ed
6859.Pp
6860Note that
6861.Ic exit
6862in the inner loop will only exit the subshell and not the original shell.
6863Likewise, if the code is inside a function,
6864.Ic return
6865in the inner loop will only exit the subshell and won't terminate the function.
6866.Pp
6867Use co-processes instead:
6868.Bd -literal -offset indent
6869bar \*(Ba baz \*(Ba&
6870while read \-p foo; do ...; done
6871exec 3\*(Gt&p; exec 3\*(Gt&\-
6872.Ed
6873.Pp
6874If
6875.Ic read
6876is run in a loop such as
6877.Ic while read foo; do ...; done
6878then leading whitespace will be removed (IFS) and backslashes processed.
6879You might want to use
6880.Ic while IFS= read \-r foo; do ...; done
6881for pristine I/O.
6882Similarly, when using the
6883.Fl a
6884option, use of the
6885.Fl r
6886option might be prudent
6887.Pq Dq Li read \-raN\-1 arr \*(Ltfile ;
6888the same applies for NUL-terminated lines:
6889.Bd -literal -offset indent
6890find . \-type f \-print0 \*(Ba& \e
6891 while IFS= read \-d \*(aq\*(aq \-pr filename; do
6892 print \-r \-\- "found \*(Lt${filename#./}\*(Gt"
6893done
6894.Ed
6895.Pp
6896.Ss "What differences in function-local scopes are there?"
6897.Nm
6898has a different scope model from
6899.At
6900.Nm ksh ,
6901which leads to subtle differences in semantics for identical builtins.
6902This can cause issues with a
6903.Ic nameref
6904to suddenly point to a local variable by accident.
6905.Pp
6906.Tn GNU
6907.Nm bash
6908allows unsetting local variables; in
6909.Nm ,
6910doing so in a function allows back access to the global variable
6911(actually the one in the next scope up) with the same name.
6912The following code, when run before the function definitions, changes
6913the behaviour of
6914.Ic unset
6915to behave like other shells (the alias can be removed after the definitions):
6916.Bd -literal -offset indent
6917case ${KSH_VERSION:\-} in
6918*MIRBSD\ KSH*\*(Ba*LEGACY\ KSH*)
6919 function unset_compat {
6920 \e\ebuiltin typeset unset_compat_x
6921
6922 for unset_compat_x in "$@"; do
6923 eval "\e\e\e\ebuiltin unset $unset_compat_x[*]"
6924 done
6925 }
6926 \e\ebuiltin alias unset=unset_compat
6927 ;;
6928esac
6929.Ed
6930.Pp
6931When a local variable is created (e.g. using
6932.Ic local ,
6933.Ic typeset ,
6934.Ic integer ,
6935.Ic \e\ebuiltin typeset )
6936it does not, like in other shells, inherit the value from the global
6937(next scope up) variable with the same name; it is rather created
6938without any value (unset but defined).
6939.Ss "I get an error in this regex comparison"
6940Use extglobs instead of regexes:
6941.Dl "[[ foo =~ (foo\*(Babar).*baz ]] # becomes"
6942.Dl "[[ foo = *@(foo\*(Babar)*baz* ]] # instead"
6943.Ss "Are there any extensions to avoid?"
6944.Tn GNU
6945.Nm bash
6946supports
6947.Dq Li &\*(Gt
6948.Pq and Dq Li \*(Ba&
6949to redirect both stdout and stderr in one go, but this breaks POSIX
6950and Korn Shell syntax; use POSIX redirections instead:
6951.Dl "foo \*(Ba& bar \*(Ba& baz &\*(Gtlog # GNU bash"
6952.Dl "foo 2\*(Gt&1 \*(Ba bar 2\*(Gt&1 \*(Ba baz \*(Gtlog 2\*(Gt&1 # POSIX"
6953.Ss "\*(haL (Ctrl-L) does not clear the screen"
6954Use \*(ha[\*(haL (Escape+Ctrl-L) or rebind it:
6955.Dl bind \*(aq\*(haL=clear-screen\*(aq
6956.Ss "\*(haU (Ctrl-U) clears the entire line"
6957If it should only delete the line up to the cursor, use:
6958.Dl bind \-m \*(haU=\*(aq\*(ha[0\*(haK\*(aq
6959.Ss "Cursor Up behaves differently from zsh"
6960Some shells make Cursor Up search in the history only for
6961commands starting with what was already entered.
6962.Nm
6963separates the shortcuts: Cursor Up goes up one command
6964and PgUp searches the history as described above.
Elliott Hughes23925bb2017-09-22 16:04:20 -07006965.Ss "My question is not answered here!"
6966Check
6967.Pa http://www.mirbsd.org/mksh\-faq.htm
6968which contains a collection of frequently asked questions about
6969.Nm
6970in general, for packagers, etc. while these above are in user scope.