From 09cff699a514e452eccc6420f1213967b767cb3e Mon Sep 17 00:00:00 2001 From: Kiyoshi Aman Date: Fri, 15 Mar 2019 13:08:45 -0500 Subject: rm bin/sh usr.bin/make: utilities provided by other packages --- bin/sh/sh.1 | 4549 ----------------------------------------------------------- 1 file changed, 4549 deletions(-) delete mode 100644 bin/sh/sh.1 (limited to 'bin/sh/sh.1') diff --git a/bin/sh/sh.1 b/bin/sh/sh.1 deleted file mode 100644 index 4630689..0000000 --- a/bin/sh/sh.1 +++ /dev/null @@ -1,4549 +0,0 @@ -.\" $NetBSD: sh.1,v 1.217 2019/01/21 14:09:24 kre Exp $ -.\" Copyright (c) 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" This code is derived from software contributed to Berkeley by -.\" Kenneth Almquist. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)sh.1 8.6 (Berkeley) 5/4/95 -.\" -.Dd December 12, 2018 -.Dt SH 1 -.\" everything except c o and s (keep them ordered) -.ds flags abCEeFfhIiLmnpquVvXx -.Os -.Sh NAME -.Nm sh -.Nd command interpreter (shell) -.Sh SYNOPSIS -.Nm -.Bk -words -.Op Fl \*[flags] -.Op Cm +\*[flags] -.Ek -.Bk -words -.Op Fl o Ar option_name -.Op Cm +o Ar option_name -.Ek -.Bk -words -.Op Ar command_file Op Ar argument ... -.Ek -.Nm -.Fl c -.Bk -words -.Op Fl s -.Op Fl \*[flags] -.Op Cm +\*[flags] -.Ek -.Bk -words -.Op Fl o Ar option_name -.Op Cm +o Ar option_name -.Ek -.Bk -words -.Ar command_string -.Op Ar command_name Op Ar argument ... -.Ek -.Nm -.Fl s -.Bk -words -.Op Fl \*[flags] -.Op Cm +\*[flags] -.Ek -.Bk -words -.Op Fl o Ar option_name -.Op Cm +o Ar option_name -.Ek -.Bk -words -.Op Ar argument ... -.Ek -.Sh DESCRIPTION -.Nm -is the standard command interpreter for the system. -The current version of -.Nm -is in the process of being changed to conform more closely to the -POSIX 1003.2 and 1003.2a specifications for the shell. -This version has many -features which make it appear similar in some respects to the Korn shell, -but it is not a Korn shell clone (see -.Xr ksh 1 ) . -This man page is not intended -to be a tutorial or a complete specification of the shell. -.Ss Overview -The shell is a command that reads lines from either a file or the -terminal, interprets them, and generally executes other commands. -A shell is the program that is running when a user logs into the system. -(Users can select which shell is executed for them at login with the -.Xr chsh 1 -command). -The shell implements a language that has flow control -constructs, a macro facility that provides a variety of features in -addition to data storage, along with built in history and line editing -capabilities. -It incorporates many features to aid interactive use and -has the advantage that the interpretative language is common to both -interactive and non-interactive use (shell scripts). -That is, commands -can be typed directly to the running shell or can be put into a file and -the file can be executed directly by the shell. -.Ss Invocation -If no arguments are present and if the standard input, -and standard error output, of the shell -are connected to a terminal (or terminals, or if the -.Fl i -flag is set), -and the -.Fl c -option is not present, the shell is considered an interactive shell. -An interactive shell generally prompts before each command and handles -programming and command errors differently (as described below). -When first starting, -the shell inspects argument 0, and if it begins with a dash -.Sq - , -the shell is also considered -a login shell. -This is normally done automatically by the system -when the user first logs in. -A login shell first reads commands -from the files -.Pa /etc/profile -and -.Pa .profile -in the user's home directory -.Pq \&$HOME , -if they exist. -If the environment variable -.Ev ENV -is set on entry to a shell, -or is set in the -.Pa .profile -of a login shell, -and either the shell is interactive, or the -.Cm posix -option is not set, -the shell then performs parameter and arithmetic -expansion on the value of -.Ev ENV , -(these are described later) -and then reads commands from the file name that results. -If -.Ev ENV -contains a command substitution, or one of the -other expansions fails, or if there are no expansions -to expand, the value of -.Ev ENV -is used as the file name. -.Pp -Therefore, a user should place commands that are to be executed only at -login time in the -.Pa .profile -file, and commands that are executed for every shell inside the -.Ev ENV -file. -To set the -.Ev ENV -variable to some file, place the following line in your -.Pa .profile -of your home directory -.Pp -.Dl ENV=$HOME/.shinit; export ENV -.Pp -substituting for -.Dq .shinit -any filename you wish. -Since the -.Ev ENV -file can be read for every invocation of the shell, including shell scripts -and non-interactive shells, the following paradigm is useful for -restricting commands in the -.Ev ENV -file to interactive invocations. -Place commands within the -.Dq Ic case -and -.Dq Ic esac -below (these commands are described later): -.Bd -literal -offset indent -case $- in *i*) - # commands for interactive use only - ... -esac -.Ed -.Pp -If command line arguments besides the options have been specified, and -neither -.Fl c -nor -.Fl s -was given, then the shell treats the first argument -as the name of a file from which to read commands (a shell script). -This also becomes -.Li $0 -and the remaining arguments are set as the -positional parameters of the shell -.Li ( $1 , $2 , -etc). -Otherwise, if -.Fl c -was given, then the first argument, which must exist, -is taken to be a string of -.Nm -commands to execute. -Then if any additional arguments follow the command string, -those arguments become -.Li $0 , $1 , -\&... -Otherwise, if additional arguments were given -(which implies that -.Fl s -was set) -those arguments become -.Li $1 , $2 , -\&... -If -.Li $0 -has not been set by the preceding processing, it -will be set to -.Va argv\^ Ns [ 0 ] -as passed to the shell, which will -usually be the name of the shell itself. -If -.Fl s -was given, or if neither -.Fl c -nor any additional (non-option) arguments were present, -the shell reads commands from its standard input. -.\" -.\" -.Ss Argument List Processing -.\" -Currently, all of the single letter options that can meaningfully -be set using the -.Ic set -built-in, have a corresponding name -that can be used as an argument to the -.Fl o -option. -The -.Ic set Fl o -name is provided next to the single letter option in -the description below. -Some options have only a long name, they are described after -the flag options, they are used with -.Fl o -or -.Cm +o -only, either on the command line, or with the -.Ic set -built-in command. -Other options described are for the command line only. -Specifying a dash -.Dq Cm \- -turns the option on, while using a plus -.Dq Cm + -disables the option. -The following options can be set from the command line and, -unless otherwise stated, with the -.Ic set -built-in (described later). -.\" -.\" strlen("quietprofile") == strlen("local_lineno"): pick the latter -.\" to give the indent as the _ in local_lineno, and the fi ligature in -.\" quietprofile combine to make "local_lineno' slightly wider when printed -.\" (in italics) in a variable width font. -.Bl -tag -width ".Fl L Em local_lineno" -offset indent -.\" -.It Fl a Em allexport -Automatically export any variable to which a value is assigned -while this flag is set, unless the variable has been marked as -not for export. -.It Fl b Em notify -Enable asynchronous notification of background job completion. -(Not implemented.) -.It Fl C Em noclobber -Don't overwrite existing files with -.Dq > . -.It Fl c -Read commands from the -.Ar command_string -operand instead of, or in addition to, from the standard input. -Special parameter -.Dv 0 \" $0 (comments like this for searching sources only) -will be set from the -.Ar command_name -operand if given, and the positional parameters -.Dv ( 1 , 2 , -etc.) -set from the remaining argument operands, if any. -.Fl c -is only available at invocation, it cannot be -.Ic set , -and there is no form using -.Dq Cm \&+ . -.It Fl E Em emacs -Enable the built-in emacs style -command line editor (disables -.Fl V -if it has been set). -(See the -.Sx Command Line Editing -section below.) -.It Fl e Em errexit -If not interactive, exit immediately if any untested command fails. -If interactive, and an untested command fails, -cease all processing of the current command and return to -prompt for a new command. -The exit status of a command is considered to be -explicitly tested if the command is used to control an -.Ic if , -.Ic elif , -.Ic while , -or -.Ic until , -or if the command is the left hand operand of an -.Dq && -or -.Dq || -operator, -or if it is a pipeline (or simple command) preceded by the -.Dq \&! -operator. -With pipelines, only the status of the entire pipeline -(indicated by the last command it contains) -is tested when -.Fl e -is set to determine if the shell should exit. -.It Fl F Em fork -Cause the shell to always use -.Xr fork 2 -instead of attempting -.Xr vfork 2 -when it needs to create a new process. -This should normally have no visible effect, -but can slow execution. -The -.Nm -can be compiled to always use -.Xr fork 2 -in which case altering the -.Fl F -flag has no effect. -.It Fl f Em noglob -Disable pathname expansion. -.It Fl h Em trackall -Functions defined while this option is set will have paths bound to -commands to be executed by the function at the time of the definition. -When off when a function is defined, -the file system is searched for commands each time the function is invoked. -(Not implemented.) -.It Fl I Em ignoreeof -Ignore EOFs from input when interactive. -(After a large number of consecutive EOFs the shell will exit anyway.) -.It Fl i Em interactive -Force the shell to behave interactively. -.It Fl L Em local_lineno -When set, before a function is defined, -causes the variable -.Dv LINENO -when used within the function, -to refer to the line number defined such that -first line of the function is line 1. -When reset, -.Dv LINENO -in a function refers to the line number within the file -within which the definition of the function occurs. -This option defaults to -.Dq on -in this shell. -For more details see the section -.Sx LINENO -below. -.It Fl m Em monitor -Turn on job control (set automatically when interactive). -.It Fl n Em noexec -Read and parse commands, but do not execute them. -This is useful for checking the syntax of shell scripts. -If -.Fl n -becomes set in an interactive shell, it will automatically be -cleared just before the next time the command line prompt -.Pq Ev PS1 -is written. -.It Fl p Em nopriv -Do not attempt to reset effective UID if it does not match UID. -This is not set by default to help avoid incorrect usage by setuid -root programs via -.Xr system 3 -or -.Xr popen 3 . -.It Fl q Em quietprofile -If the -.Fl v -or -.Fl x -options have been set, do not apply them when reading -initialization files, these being -.Pa /etc/profile , -.Pa .profile , -and the file specified by the -.Ev ENV -environment variable. -.It Fl s Em stdin -Read commands from standard input (set automatically if -neither -.Fl c -nor file arguments are present). -If after processing a command_string with the -.Fl c -option, the shell has not exited, and the -.Fl s -option is set, it will continue reading more commands from standard input. -This option has no effect when set or reset after the shell has -already started reading from the command_file, or from standard input. -Note that the -.Fl s -flag being set does not cause the shell to be interactive. -.It Fl u Em nounset -Write a message to standard error when attempting to obtain a -value from a variable that is not set, -and if the shell is not interactive, exit immediately. -For interactive shells, instead return immediately to the command prompt -and read the next command. -Note that expansions (described later, see -.Sx Word Expansions -below) using the -.Sq \&+ , -.Sq \&\- , -.Sq \&= , -or -.Sq \&? -operators test if the variable is set, before attempting to -obtain its value, and hence are unaffected by -.Fl u . -.It Fl V Em vi -Enable the built-in -.Xr vi 1 -command line editor (disables -.Fl E -if it has been set). -(See the -.Sx Command Line Editing -section below.) -.It Fl v Em verbose -The shell writes its input to standard error as it is read. -Useful for debugging. -.It Fl X Em xlock -Cause output from the -.Ic xtrace -.Pq Fl x -option to be sent to standard error as it exists when the -.Fl X -option is enabled (regardless of its previous state.) -For example: -.Bd -literal -compact - set -X 2>/tmp/trace-file -.Ed -will arrange for tracing output to be sent to the file named, -instead of wherever it was previously being sent, -until the X option is set again, or cleared. -.Pp -Each change (set or clear) to -.Fl X -is also performed upon -.Fl x , -but not the converse. -.It Fl x Em xtrace -Write each command to standard error (preceded by the expanded value of -.Li $PS4 ) -before it is executed. -Unless -.Fl X -is set, -.Dq "standard error" -means that which existed immediately before any redirections to -be applied to the command are performed. -Useful for debugging. -.It "\ \ " Em cdprint -Make an interactive shell always print the new directory name when -changed by the -.Ic cd -command. -In a non-interactive shell this option has no effect. -.It "\ \ " Em nolog -Prevent the entry of function definitions into the command history (see -.Ic fc -in the -.Sx Built-ins -section.) -(Not implemented.) -.It "\ \ " Em pipefail -If set when a pipeline is created, -the way the exit status of the pipeline is determined -is altered. -See -.Sx Pipelines -below for the details. -.It "\ \ " Em posix -Enables closer adherence to the POSIX shell standard. -This option will default set at shell startup if the -environment variable -.Ev POSIXLY_CORRECT -is present. -That can be overridden (set or reset) by the -.Fl o -option on the command line. -Currently this option controls whether (!posix) or not (posix) -the file given by the -.Ev ENV -variable is read at startup by a non-interactive shell. -It also controls whether file descriptors greater than 2 -opened using the -.Ic exec -built-in command are passed on to utilities executed -.Dq ( yes -in posix mode), -whether a colon (:) terminates the user name in tilde (~) expansions -other than in assignment statements -.Dq ( no -in posix mode), -the format of the output of the -.Ic kill Fl l -command, where posix mode causes the names of the signals -be separated by either a single space or newline, and where otherwise -sufficient spaces are inserted to generate nice looking columns, -and whether the shell treats -an empty brace-list compound statement as a syntax error -(expected by POSIX) or permits it. -Such statements -.Dq "{\ }" -can be useful when defining dummy functions. -Lastly, in posix mode, only one -.Dq \&! -is permitted before a pipeline. -.It "\ \ " Em promptcmds -Allows command substitutions (as well as parameter -and arithmetic expansions, which are always performed) -upon the prompt strings -.Ev PS1 , -.Ev PS2 , -and -.Ev PS4 -each time, before they are output. -This option should not be set until after the prompts -have been set (or verified) to avoid accidentally importing -unwanted command substitutions from the environment. -.It "\ \ " Em tabcomplete -Enables filename completion in the command line editor. -Typing a tab character will extend the current input word to match a -filename. -If more than one filename matches it is only extended to be the common prefix. -Typing a second tab character will list all the matching names. -One of the editing modes, either -.Fl E -or -.Fl V , -must be enabled for this to work. -.El -.Ss Lexical Structure -The shell reads input in terms of lines from a file and breaks it up into -words at whitespace (blanks and tabs), and at certain sequences of -characters that are special to the shell called -.Dq operators . -There are two types of operators: control operators and redirection -operators (their meaning is discussed later). -The following is a list of operators: -.Bl -ohang -offset indent -.It "Control operators:" -.Dl & && \&( \&) \&; ;; ;& \&| || -.It "Redirection operators:" -.Dl < > >| << >> <& >& <<- <> -.El -.Ss Quoting -Quoting is used to remove the special meaning of certain characters or -words to the shell, such as operators, whitespace, or keywords. -There are four types of quoting: -matched single quotes, -matched double quotes, -backslash, -and -dollar preceding matched single quotes (enhanced C style strings.) -.Ss Backslash -An unquoted backslash preserves the literal meaning of the following -character, with the exception of -.Aq newline . -An unquoted backslash preceding a -.Aq newline -is treated as a line continuation, the two characters are simply removed. -.Ss Single Quotes -Enclosing characters in single quotes preserves the literal meaning of all -the characters (except single quotes, making it impossible to put -single quotes in a single-quoted string). -.Ss Double Quotes -Enclosing characters within double quotes preserves the literal -meaning of all characters except dollar sign -.Pq Li \&$ , -backquote -.Pq Li \&` , -and backslash -.Pq Li \e . -The backslash inside double quotes is historically weird, and serves to -quote only the following characters (and these not in all contexts): -.Dl $ ` \*q \e , -where a backslash newline is a line continuation as above. -Otherwise it remains literal. -.\" -.\" -.Ss Dollar Single Quotes ( Li \&$'...' ) -.\" -.Bd -filled -offset indent -.Bf Em -Note: this form of quoting is still somewhat experimental, -and yet to be included in the POSIX standard. -This implementation is based upon the current proposals for -standardization, and is subject to change should the eventual -adopted text differ. -.Ef -.Ed -.Pp -Enclosing characters in a matched pair of single quotes, with the -first immediately preceded by an unquoted dollar sign -.Pq Li \&$ -provides a quoting mechanism similar to single quotes, except -that within the sequence of characters, any backslash -.Pq Li \e , -is an escape character, which causes the following character to -be treated specially. -Only a subset of the characters that can occur in the string -are defined after a backslash, others are reserved for future -definition, and currently generate a syntax error if used. -The escape sequences are modeled after the similar sequences -in strings in the C programming language, with some extensions. -.Pp -The following characters are treated literally when following -the escape character (backslash): -.Dl \e \&' \(dq -The sequence -.Dq Li \e\e -allows the escape character (backslash) to appear in the string literally. -.Dq Li \e' -allows a single quote character into the string, such an -escaped single quote does not terminate the quoted string. -.Dq Li \e\(dq -is for compatibility with C strings, the double quote has -no special meaning in a shell C-style string, -and does not need to be escaped, but may be. -.Pp -A newline following the escape character is treated as a line continuation, -like the same sequence in a double quoted string, -or when not quoted \(en -the two characters, the backslash escape and the newline, -are removed from the input string. -.Pp -The following characters, when escaped, are converted in a -manner similar to the way they would be in a string in the C language: -.Dl a b e f n r t v -An escaped -.Sq a -generates an alert (or -.Sq BEL ) -character, that is, control-G, or 0x07. -In a similar way, -.Sq b -is backspace (0x08), -.Sq e -(an extension to C) is escape (0x1B), -.Sq f -is form feed (0x0C), -.Sq n -is newline (or line feed, 0x0A), -.Sq r -is return (0x0D), -.Sq t -is horizontal tab (0x09), -and -.Sq v -is vertical tab (0x13). -.Pp -In addition to those there are 5 forms that need additional -data, which is obtained from the subsequent characters. -An escape -.Pq Li \e -followed by one, two or three, octal digits -.Po So 0 Sc Ns \&.. Ns So 7 Sc Ns Pc -is processed to form an 8 bit character value. -If only one or two digits are present, the following -character must be something other than an octal digit. -It is safest to always use all 3 digits, with leading -zeros if needed. -If all three digits are present, the first must be one of -.So 0 Sc Ns \&.. Ns So 3 Sc . -.Pp -An escape followed by -.Sq x -(lower case only) can be followed by one or two -hexadecimal digits -.Po So 0 Sc Ns \&.. Ns So 9 Sc , So A Sc Ns \&.. Ns So F Sc , or So a Sc Ns \&.. Ns So f Sc . Pc -As with octal, if only one hex digit is present, the following -character must be something other than a hex digit, -so always giving 2 hex digits is best. -However, unlike octal, it is unspecified in the standard -how many hex digits can be consumed. -This -.Nm -takes at most two, but other shells will continue consuming -characters as long as they remain valid hex digits. -Consequently, users should ensure that the character -following the hex escape sequence is something other than -a hex digit. -One way to achieve this is to end the -.Li $'...' -string immediately -after the final hex digit, and then, immediately start -another, so -.Dl \&$'\ex33'$'4...' -always gives the character with value 0x33 -.Pq Sq 3 , -followed by the character -.Sq 4 , -whereas -.Dl \&$'\ex334' -in some other shells would be the hex value 0x334 (10, or more, bits). -.Pp -There are two escape sequences beginning with -.Sq Li \eu -or -.Sq Li \eU . -The former is followed by from 1 to 4 hex digits, the latter by -from 1 to 8 hex digits. -Leading zeros can be used to pad the sequences to the maximum -permitted length, to avoid any possible ambiguity problem with -the following character, and because there are some shells that -insist on exactly 4 (or 8) hex digits. -These sequences are evaluated to form the value of a Unicode code -point, which is then encoded into UTF-8 form, and entered into the -string. -(The code point should be converted to the appropriate -code point value for the corresponding character in the character -set given by the current locale, or perhaps the locale in use -when the shell was started, but is not... currently.) -Not all values that are possible to write are valid, values that -specify (known) invalid Unicode code points will be rejected, or -simply produce -.Sq \&? . -.Pp -Lastly, as another addition to what is available in C, the escape -character (backslash), followed by -.Sq c -(lower case only) followed by one additional character, which must -be an alphabetic character (a letter), or one of the following: -.Dl \&@ \&[ \&\e \&] \&^ \&_ \&? -Other than -.Sq Li \ec? -the value obtained is the least significant 5 bits of the -ASCII value of the character following the -.Sq Li \ec -escape sequence. -That is what is commonly known as the -.Dq control -character obtained from the given character. -The escape sequence -.Sq Li \ec? -yields the ASCII DEL character (0x7F). -Note that to obtain the ASCII FS character (0x1C) this way, -.Pq "that is control-\e" -the trailing -.Sq Li \e -must be escaped itself, and so for this one case, the full -escape sequence is -.Dq Li \ec\e\e . -The sequence -.Dq Li \ec\e Ns Ar X\^ -where -.Sq Ar X\^ -is some character other than -.Sq Li \e -is reserved for future use, its meaning is unspecified. -In this -.Nm -an error is generated. -.Pp -If any of the preceding escape sequences generate the value -.Sq \e0 -(a NUL character) that character, and all that follow in the same -.Li $'...' -string, are omitted from the resulting word. -.Pp -After the -.Li $'...' -string has had any included escape sequences -converted, it is treated as if it had been a single quoted string. -.\" -.\" -.Ss Reserved Words -.\" -Reserved words are words that have special meaning to the -shell and are recognized at the beginning of a line and -after a control operator. -The following are reserved words: -.Bl -column while while while while -offset indent -.It Ic \&! Ta Ic \&{ Ta Ic \&} Ta Ic case -.It Ic do Ta Ic done Ta Ic elif Ta Ic else -.It Ic esac Ta Ic fi Ta Ic for Ta Ic if -.It Ic in Ta Ic then Ta Ic until Ta Ic while -.El -.Pp -Their meanings are discussed later. -.\" -.\" -.Ss Aliases -.\" -An alias is a name and corresponding value set using the -.Ic alias -built-in command. -Whenever a reserved word (see above) may occur, -and after checking for reserved words, the shell -checks the word to see if it matches an alias. -If it does, it replaces it in the input stream with its value. -For example, if there is an alias called -.Dq lf -with the value -.Dq "ls -F" , -then the input: -.Pp -.Dl lf foobar Aq return -.Pp -would become -.Pp -.Dl ls -F foobar Aq return -.Pp -Aliases provide a convenient way for naive users to create shorthands for -commands without having to learn how to create functions with arguments. -They can also be used to create lexically obscure code. -This use is strongly discouraged. -.\" -.Ss Commands -.\" -The shell interprets the words it reads according to a language, the -specification of which is outside the scope of this man page (refer to the -BNF in the POSIX 1003.2 document). -Essentially though, a line is read and if the first -word of the line (or after a control operator) is not a reserved word, -then the shell has recognized a simple command. -Otherwise, a complex -command or some other special construct may have been recognized. -.\" -.\" -.Ss Simple Commands -.\" -If a simple command has been recognized, the shell performs -the following actions: -.Bl -enum -offset indent -.It -Leading words of the form -.Dq Ar name Ns Li = Ns Ar value -are stripped off, the value is expanded, as described below, -and the results are assigned to the environment of the simple command. -Redirection operators and their arguments (as described below) are -stripped off and saved for processing in step 3 below. -.It -The remaining words are expanded as described in the -.Sx Word Expansions -section below. -The first remaining word is considered the command name and the -command is located. -Any remaining words are considered the arguments of the command. -If no command name resulted, then the -.Dq Ar name Ns Li = Ns Ar value -variable assignments recognized in item 1 affect the current shell. -.It -Redirections are performed, from first to last, in the order given, -as described in the next section. -.El -.\" -.\" -.Ss Redirections -.\" -Redirections are used to change where a command reads its input or sends -its output. -In general, redirections open, close, or duplicate an -existing reference to a file. -The overall format used for redirection is: -.Pp -.Dl Oo Ar n Oc Ns Va redir-op Ar file -.Pp -where -.Va redir-op -is one of the redirection operators mentioned previously. -The following is a list of the possible redirections. -The -.Op Ar n -is an optional number, as in -.Sq Li 3 -(not -.Li [3] ) , -that refers to a file descriptor. -If present it must occur immediately before the redirection -operator, with no intervening white space, and becomes a -part of that operator. -.Bl -tag -width aaabsfiles -offset indent -.It Oo Ar n Oc Ns Ic > Ar file -Redirect standard output (or -.Ar n ) -to -.Ar file . -.It Oo Ar n Oc Ns Ic >| Ar file -The same, but override the -.Fl C -option. -.It Oo Ar n Oc Ns Ic >> Ar file -Append standard output (or -.Ar n ) -to -.Ar file . -.It Oo Ar n Oc Ns Ic < Ar file -Redirect standard input (or -.Ar n ) -from -.Ar file . -.It Oo Ar n1 Oc Ns Ic <& Ns Ar n2 -Duplicate standard input (or -.Ar n1 ) -from file descriptor -.Ar n2 . -.Ar n2 -is expanded if not a digit string, the result must be a number. -.It Oo Ar n Oc Ns Ic <&- -Close standard input (or -.Ar n ) . -.It Oo Ar n1 Oc Ns Ic >& Ns Ar n2 -Duplicate standard output (or -.Ar n1 ) -to -.Ar n2 . -.It Oo Ar n Oc Ns Ic >&- -Close standard output (or -.Ar n ) . -.It Oo Ar n Oc Ns Ic <> Ar file -Open -.Ar file -for reading and writing on standard input (or -.Ar n ) . -.El -.Pp -The following redirection is often called a -.Dq here-document . -.Bd -unfilled -offset indent -.Oo Ar n Oc Ns Ic << Ar delimiter -.Li \&... here-doc-text ... -.Ar delimiter -.Ed -.Pp -The -.Dq here-doc-text -starts immediately after the next unquoted newline character following -the here-document redirection operator. -If there is more than one here-document redirection on the same -line, then the text for the first (from left to right) is read -first, and subsequent here-doc-text for later here-document redirections -follows immediately after, until all such redirections have been -processed. -.Pp -All the text on successive lines up to the delimiter, -which must appear on a line by itself, with nothing other -than an immediately following newline, is -saved away and made available to the command on standard input, or file -descriptor n if it is specified. -If the delimiter as specified on the initial line is -quoted, then the here-doc-text is treated literally; otherwise, the text is -treated much like a double quoted string, except that -.Sq Li \(dq -characters have no special meaning, and are not escaped by -.Sq Li \&\e , -and is subjected to parameter expansion, command substitution, and arithmetic -expansion as described in the -.Sx Word Expansions -section below. -If the operator is -.Ic <<- -instead of -.Ic << , -then leading tabs in all lines in the here-doc-text, including before the -end delimiter, are stripped. -If the delimiter is not quoted, lines in here-doc-text that end with -an unquoted -.Li \e -are joined to the following line, the -.Li \e -and following -newline are simply removed while reading the here-document, -which thus guarantees -that neither of those lines can be the end delimiter. -.Pp -It is a syntax error for the end of the input file (or string) to be -reached before the delimiter is encountered. -.\" -.\" -.Ss Search and Execution -.\" -There are three types of commands: shell functions, built-in commands, and -normal programs \(em and the command is searched for (by name) in that order. -A command that contains a slash -.Sq \&/ -in its name is always a normal program. -They each are executed in a different way. -.Pp -When a shell function is executed, all of the shell positional parameters -(note: excluding -.Li 0 , \" $0 -which is a special, not positional, parameter, and remains unchanged) -are set to the arguments of the shell function. -The variables which are explicitly placed in the environment of -the command (by placing assignments to them before the function name) are -made local to the function and are set to the values given, -and exported for the benefit of programs executed with the function. -Then the command given in the function definition is executed. -The positional parameters, and local variables, are restored to -their original values when the command completes. -This all occurs within the current shell, and the function -can alter variables, or other settings, of the shell, but -not the positional parameters nor their related special parameters. -.Pp -Shell built-ins are executed internally to the shell, without spawning a -new process. -.Pp -Otherwise, if the command name doesn't match a function or built-in, the -command is searched for as a normal program in the file system (as -described in the next section). -When a normal program is executed, the shell runs the program, -passing the arguments and the environment to the program. -If the program is not a normal executable file, and if it does -not begin with the -.Dq magic number -whose ASCII representation is -.Dq Li "#!" , -so -.Xr execve 2 -returns -.Er ENOEXEC -then) the shell will interpret the program in a sub-shell. -The child shell will reinitialize itself in this case, -so that the effect will be as if a -new shell had been invoked to handle the ad-hoc shell script, except that -the location of hashed commands located in the parent shell will be -remembered by the child. -.Pp -Note that previous versions of this document and the source code itself -misleadingly and sporadically refer to a shell script without a magic -number as a -.Dq shell procedure . -.\" -.\" -.Ss Path Search -.\" -When locating a command, the shell first looks to see if it has a shell -function by that name. -Then it looks for a built-in command by that name. -If a built-in command is not found, one of two things happen: -.Bl -enum -.It -Command names containing a slash are simply executed without performing -any searches. -.It -Otherwise, the shell searches each entry in -.Ev PATH -in turn for the command. -The value of the -.Ev PATH -variable should be a series of entries separated by colons. -Each entry consists of a directory name. -The current directory may be indicated -implicitly by an empty directory name, or explicitly by a single period. -If a directory searched contains an executable file with the same -name as the command given, -the search terminates, and that program is executed. -.El -.Ss Command Exit Status -Each command has an exit status that can influence the behavior -of other shell commands. -The paradigm is that a command exits -with zero in normal cases, or to indicate success, -and non-zero for failure, -error, or a false indication. -The man page for each command -should indicate the various exit codes and what they mean. -Additionally, the built-in commands return exit codes, as does -an executed shell function. -.Pp -If a command consists entirely of variable assignments then the -exit status of the command is that of the last command substitution -if any, otherwise 0. -.Pp -If redirections are present, and any fail to be correctly performed, -any command present is not executed, and an exit status of 2 -is returned. -.Ss Complex Commands -Complex commands are combinations of simple commands with control -operators or reserved words, together creating a larger complex command. -Overall, a shell program is a: -.Bl -tag -width XpipelineX -.It list -Which is a sequence of one or more AND-OR lists. -.It "AND-OR list" -is a sequence of one or more pipelines. -.It pipeline -is a sequence of one or more commands. -.It command -is one of a simple command, a compound command, or a function definition. -.It "simple command" -has been explained above, and is the basic building block. -.It "compound command" -provides mechanisms to group lists to achieve different effects. -.It "function definition" -allows new simple commands to be created as groupings of existing commands. -.El -.Pp -Unless otherwise stated, the exit status of a list -is that of the last simple command executed by the list. -.\" -.\" -.Ss Pipelines -.\" -A pipeline is a sequence of one or more commands separated -by the control operator -.Sq Ic \(ba , -and optionally preceded by the -.Dq Ic \&! -reserved word. -Note that -.Sq Ic \(ba -is an operator, and so is recognized anywhere it appears unquoted, -it does not require surrounding white space or other syntax elements. -On the other hand -.Dq Ic \&! -being a reserved word, must be separated from adjacent words by -white space (or other operators, perhaps redirects) and is only -recognized as the reserved word when it appears in a command word -position (such as at the beginning of a pipeline.) -.Pp -The standard output of all but -the last command in the sequence is connected to the standard input -of the next command. -The standard output of the last -command is inherited from the shell, as usual, -as is the standard input of the first command. -.Pp -The format for a pipeline is: -.Pp -.Dl [!] command1 Op Li \&| command2 No ... -.Pp -The standard output of command1 is connected to the standard input of -command2. -The standard input, standard output, or both of each command is -considered to be assigned by the pipeline before any redirection specified -by redirection operators that are part of the command are performed. -.Pp -If the pipeline is not in the background (discussed later), the shell -waits for all commands to complete. -.Pp -The commands in a pipeline can either be simple commands, -or one of the compound commands described below. -The simplest case of a pipeline is a single simple command. -.Pp -If the -.Ic pipefail -option was set when a pipeline was started, -the pipeline status is the status of -the last (lexically last, i.e.: rightmost) command in the -pipeline to exit with non-zero exit status, or zero, if, -and only if, all commands in the pipeline exited with a status of zero. -If the -.Ic pipefail -option was not set, which is the default state, -the pipeline status is the exit -status of the last (rightmost) command in the pipeline, -and the exit status of any other commands in the pipeline is ignored. -.Pp -If the reserved word -.Dq Ic \&! -precedes the pipeline, the exit status -becomes the logical NOT of the pipeline status as determined above. -That is, if the pipeline status is zero, the exit status is 1; -if the pipeline status is other than zero, the exit status is zero. -If there is no -.Dq Ic \&! -reserved word, the pipeline status becomes the exit status. -.Pp -Because pipeline assignment of standard input or standard output or both -takes place before redirection, it can be modified by redirection. -For example: -.Pp -.Dl $ command1 2>&1 \&| command2 -.Pp -sends both the standard output and standard error of command1 -to the standard input of command2. -.Pp -Note that unlike some other shells, each process in the pipeline is a -child of the invoking shell (unless it is a shell built-in, in which case -it executes in the current shell \(em but any effect it has on the -environment is wiped). -.Pp -A pipeline is a simple case of an AND-OR-list (described below.) -A -.Li \&; -or -.Aq newline -terminator causes the preceding pipeline, or more generally, -the preceding AND-OR-list to be executed sequentially; -that is, the shell executes the commands, and waits for them -to finish before proceeding to following commands. -An -.Li \&& -terminator causes asynchronous (background) execution -of the preceding AND-OR-list (see the next paragraph below). -The exit status of an asynchronous AND-OR-list is zero. -The actual status of the commands, -after they have completed, -can be obtained using the -.Ic wait -built-in command described later. -.\" -.\" -.Ss Background Commands \(em Ic \&& -.\" -If a command, pipeline, or AND-OR-list -is terminated by the control operator ampersand -.Pq Li \&& , -the -shell executes the command asynchronously \(em that is, the shell does not -wait for the command to finish before executing the next command. -.Pp -The format for running a command in background is: -.Pp -.Dl command1 & Op Li command2 & No ... -.Pp -If the shell is not interactive, the standard input of an asynchronous -command is set to -.Pa /dev/null . -The process identifier of the most recent command started in the -background can be obtained from the value of the special parameter -.Dq Dv \&! \" $! -(see -.Sx Special Parameters ) -provided it is accessed before the next asynchronous command is started. -.\" -.\" -.Ss Lists \(em Generally Speaking -.\" -A list is a sequence of one or more commands separated by newlines, -semicolons, or ampersands, and optionally terminated by one of these three -characters. -A shell program, which includes the commands given to an -interactive shell, is a list. -Each command in such a list is executed when it is fully parsed. -Another use of a list is as a complete-command, -which is parsed in its entirety, and then later the commands in -the list are executed only if there were no parsing errors. -.Pp -The commands in a list are executed in the order they are written. -If command is followed by an ampersand, the shell starts the -command and immediately proceeds to the next command; otherwise it waits -for the command to terminate before proceeding to the next one. -A newline is equivalent to a -.Sq Li \&; -when no other operator is present, and the command being input -could syntactically correctly be terminated at the point where -the newline is encountered, otherwise it is just whitespace. -.\" -.\" -.Ss AND-OR Lists (Short-Circuit List Operators) -.\" -.Dq Li \&&& -and -.Dq Li \&|| -are AND-OR list operators. -After executing the commands that precede the -.Dq Li \&&& -the subsequent command is executed -if and only if the exit status of the preceding command(s) is zero. -.Dq Li \&|| -is similar, but executes the subsequent command if and only if the exit status -of the preceding command is nonzero. -If a command is not executed, the exit status remains unchanged -and the following AND-OR list operator (if any) uses that status. -.Dq Li \&&& -and -.Dq Li \&|| -both have the same priority. -Note that these operators are left-associative, so -.Dl true || echo bar && echo baz -writes -.Dq baz -and nothing else. -This is not the way it works in C. -.\" -.\" -.Ss Flow-Control Constructs \(em Ic if , while , until , for , case -.\" -These commands are instances of compound commands. -The syntax of the -.Ic if -command is -.Bd -literal -offset indent -.Ic if Ar list -.Ic then Ar list -.Ic [ elif Ar list -.Ic then Ar list ] No ... -.Ic [ else Ar list ] -.Ic fi -.Ed -.Pp -The first list is executed, and if the exit status of that list is zero, -the list following the -.Ic then -is executed. -Otherwise the list after an -.Ic elif -(if any) is executed and the process repeats. -When no more -.Ic elif -reserved words, and accompanying lists, appear, -the list after the -.Ic else -reserved word, if any, is executed. -.Pp -The syntax of the -.Ic while -command is -.Bd -literal -offset indent -.Ic while Ar list -.Ic do Ar list -.Ic done -.Ed -.Pp -The two lists are executed repeatedly while the exit status of the -first list is zero. -The -.Ic until -command is similar, but has the word -.Ic until -in place of -.Ic while , -which causes it to repeat until the exit status of the first list is zero. -.Pp -The syntax of the -.Ic for -command is -.Bd -literal -offset indent -.Ic for Ar variable Op Ic in Ar word No ... -.Ic do Ar list -.Ic done -.Ed -.Pp -The words are expanded, or -.Li \*q$@\*q -if -.Ic in -(and the following words) is not present, -and then the list is executed repeatedly with the -variable set to each word in turn. -If -.Ic in -appears after the variable, but no words are -present, the list is not executed, and the exit status is zero. -.Ic do -and -.Ic done -may be replaced with -.Sq Ic \&{ -and -.Sq Ic \&} , -but doing so is non-standard and not recommended. -.Pp -The syntax of the -.Ic break -and -.Ic continue -commands is -.Bd -literal -offset indent -.Ic break Op Ar num -.Ic continue Op Ar num -.Ed -.Pp -.Ic break -terminates the -.Ar num -innermost -.Ic for , while , -or -.Ic until -loops. -.Ic continue -breaks execution of the -.Ar num\^ Ns -1 -innermost -.Ic for , while , -or -.Ic until -loops, and then continues with the next iteration of the enclosing loop. -These are implemented as special built-in commands. -The parameter -.Ar num , -if given, must be an unsigned positive integer (greater than zero). -If not given, 1 is used. -.Pp -The syntax of the -.Ic case -command is -.Bd -literal -offset indent -.Ic case Ar word Ic in -.Oo Ic \&( Oc Ar pattern Ns Ic \&) Oo Ar list Oc Ic \&;& -.Oo Ic \&( Oc Ar pattern Ns Ic \&) Oo Ar list Oc Ic \&;; -.No \&... -.Ic esac -.Ed -.Pp -The pattern can actually be one or more patterns (see -.Sx Shell Patterns -described later), separated by -.Dq \(or -characters. -.Pp -.Ar word -is expanded and matched against each -.Ar pattern -in turn, -from first to last, -with each pattern being expanded just before the match is attempted. -When a match is found, pattern comparisons cease, and the associated -.Ar list , -if given, -is evaluated. -If the list is terminated with -.Dq Ic \&;& -execution then falls through to the following list, if any, -without evaluating its pattern, or attempting a match. -When a list terminated with -.Dq Ic \&;; -has been executed, or when -.Ic esac -is reached, execution of the -.Ic case -statement is complete. -The exit status is that of the last command executed -from the last list evaluated, if any, or zero otherwise. -.\" -.\" -.Ss Grouping Commands Together -.\" -Commands may be grouped by writing either -.Dl Ic \&( Ns Ar list Ns Ic \&) -or -.Dl Ic \&{ Ar list Ns Ic \&; \&} -These also form compound commands. -.Pp -Note that while parentheses are operators, and do not require -any extra syntax, braces are reserved words, so the opening brace -must be followed by white space (or some other operator), and the -closing brace must occur in a position where a new command word might -otherwise appear. -.Pp -The first of these executes the commands in a sub-shell. -Built-in commands grouped into a -.Li \&( Ns Ar list Ns \&) -will not affect the current shell. -The second form does not fork another shell so is slightly more efficient, -and allows for commands which do affect the current shell. -Grouping commands together this way allows you to redirect -their output as though they were one program: -.Bd -literal -offset indent -{ echo -n \*qhello \*q ; echo \*qworld\*q ; } > greeting -.Ed -.Pp -Note that -.Dq Ic } -must follow a control operator (here, -.Dq Ic \&; ) -so that it is recognized as a reserved word and not as another command argument. -.\" -.\" -.Ss Functions -.\" -The syntax of a function definition is -.Pp -.Dl Ar name Ns Ic \&() Ar command Op Ar redirect No ... -.Pp -A function definition is an executable statement; when executed it -installs a function named name and returns an exit status of zero. -The command is normally a list enclosed between -.Dq { -and -.Dq } . -The standard syntax also allows the command to be any of the other -compound commands, including a sub-shell, all of which are supported. -As an extension, this shell also allows a simple command -(or even another function definition) to be -used, though users should be aware this is non-standard syntax. -This means that -.Dl l() ls \*q$@\*q -works to make -.Dq l -an alternative name for the -.Ic ls -command. -.Pp -If the optional redirect, (see -.Sx Redirections ) , -which may be of any of the normal forms, -is given, it is applied each time the -function is called. -This means that a simple -.Dq Hello World -function might be written (in the extended syntax) as: -.Bd -literal -offset indent -hello() cat < 0). -The shell sets these initially to the values of its command line arguments -that follow the name of the shell script. -The -.Ic set -built-in can also be used to set or reset them, and -.Ic shift -can be used to manipulate the list. -.Pp -To refer to the 10th (and later) positional parameters, -the form -.Li \&${ Ns Ar n Ns Li \&} -must be used. -Without the braces, a digit following -.Dq $ -can only refer to one of the first 9 positional parameters, -or the special parameter -.Dv 0 . \" $0 -The word -.Dq Li $10 -is treated identically to -.Dq Li ${1}0 . -.\" -.\" -.Ss Special Parameters -.\" -A special parameter is a parameter denoted by one of the following special -characters. -The value of the parameter is listed next to its character. -.Bl -tag -width thinhyphena -.It Dv * -Expands to the positional parameters, starting from one. -When the -expansion occurs within a double-quoted string it expands to a single -field with the value of each parameter separated by the first character of -the -.Ev IFS -variable, or by a -.Aq space -if -.Ev IFS -is unset. -.It Dv @ \" $@ -Expands to the positional parameters, starting from one. -When the expansion occurs within double quotes, each positional -parameter expands as a separate argument. -If there are no positional parameters, the -expansion of @ generates zero arguments, even when -.Dv $@ -is double-quoted. -What this basically means, for example, is -if -.Li $1 -is -.Dq abc -and -.Li $2 -is -.Dq def\ ghi , -then -.Li \*q$@\*q -expands to -the two arguments: -.Pp -.Sm off -.Dl \*q abc \*q \ \*q def\ ghi \*q -.Sm on -.It Dv # -Expands to the number of positional parameters. -.It Dv \&? -Expands to the exit status of the most recent pipeline. -.It Dv \- No (hyphen, or minus) -Expands to the current option flags (the single-letter -option names concatenated into a string) as specified on -invocation, by the set built-in command, or implicitly -by the shell. -.It Dv $ -Expands to the process ID of the invoked shell. -A sub-shell retains the same value of -.Dv $ -as its parent. -.It Dv \&! -Expands to the process ID of the most recent background -command executed from the current shell. -For a pipeline, the process ID is that of the last command in the pipeline. -If no background commands have yet been started by the shell, then -.Dq Dv \&! -will be unset. -Once set, the value of -.Dq Dv \&! -will be retained until another background command is started. -.It Dv 0 No (zero) \" $0 -Expands to the name of the shell or shell script. -.El -.\" -.\" -.Ss Word Expansions -.\" -This section describes the various expansions that are performed on words. -Not all expansions are performed on every word, as explained later. -.Pp -Tilde expansions, parameter expansions, command substitutions, arithmetic -expansions, and quote removals that occur within a single word expand to a -single field. -It is only field splitting or pathname expansion that can -create multiple fields from a single word. -The single exception to this -rule is the expansion of the special parameter -.Dv @ \" $@ -within double quotes, as was described above. -.Pp -The order of word expansion is: -.Bl -enum -.It -Tilde Expansion, Parameter Expansion, Command Substitution, -Arithmetic Expansion (these all occur at the same time). -.It -Field Splitting is performed on fields -generated by step (1) unless the -.Ev IFS -variable is null. -.It -Pathname Expansion (unless set -.Fl f -is in effect). -.It -Quote Removal. -.El -.Pp -The $ character is used to introduce parameter expansion, command -substitution, or arithmetic evaluation. -.Ss Tilde Expansion (substituting a user's home directory) -A word beginning with an unquoted tilde character (~) is -subjected to tilde expansion. -Provided all of the subsequent characters in the word are unquoted -up to an unquoted slash (/) -or when in an assignment or not in posix mode, an unquoted colon (:), -or if neither of those appear, the end of the word, -they are treated as a user name -and are replaced with the pathname of the named user's home directory. -If the user name is missing (as in -.Pa ~/foobar ) , -the tilde is replaced with the value of the -.Dv HOME -variable (the current user's home directory). -.Pp -In variable assignments, -an unquoted tilde immediately after the assignment operator (=), and -each unquoted tilde immediately after an unquoted colon in the value -to be assigned is also subject to tilde expansion as just stated. -.\" -.\" -.Ss Parameter Expansion -.\" -The format for parameter expansion is as follows: -.Pp -.Dl ${ Ns Ar expression Ns Li } -.Pp -where -.Ar expression -consists of all characters until the matching -.Sq Li } . -Any -.Sq Li } -escaped by a backslash or within a quoted string, and characters in -embedded arithmetic expansions, command substitutions, and variable -expansions, are not examined in determining the matching -.Sq Li } . -.Pp -The simplest form for parameter expansion is: -.Pp -.Dl ${ Ns Ar parameter Ns Li } -.Pp -The value, if any, of -.Ar parameter -is substituted. -.Pp -The parameter name or symbol can be enclosed in braces, -which are optional in this simple case, -except for positional parameters with more than one digit or -when parameter is followed by a character that could be interpreted as -part of the name. -If a parameter expansion occurs inside double quotes: -.Bl -enum -.It -pathname expansion is not performed on the results of the expansion; -.It -field splitting is not performed on the results of the -expansion, with the exception of the special rules for -.Dv @ . \" $@ -.El -.Pp -In addition, a parameter expansion where braces are used, -can be modified by using one of the following formats. -If the -.Sq Ic \&: -is omitted in the following modifiers, then the test in the expansion -applies only to unset parameters, not null ones. -.Bl -tag -width aaparameterwordaaaaa -.It Li ${ Ns Ar parameter Ns Ic :- Ns Ar word Ns Li } -.Sy Use Default Values. -If -.Ar parameter -is unset or null, the expansion of -.Ar word -is substituted; otherwise, the value of -.Ar parameter -is substituted. -.It Li ${ Ns Ar parameter Ns Ic := Ns Ar word Ns Li } -.Sy Assign Default Values. -If -.Ar parameter -is unset or null, the expansion of -.Ar word -is assigned to -.Ar parameter . -In all cases, the final value of -.Ar parameter -is substituted. -Only variables, not positional parameters or special -parameters, can be assigned in this way. -.It Li ${ Ns Ar parameter Ns Ic :? Ns Oo Ar word\^ Oc Ns Li } -.Sy Indicate Error if Null or Unset. -If -.Ar parameter -is unset or null, the expansion of -.Ar word -(or a message indicating it is unset if -.Ar word -is omitted) -is written to standard error and a non-interactive shell exits with -a nonzero exit status. -An interactive shell will not exit, but any associated command(s) will -not be executed. -If the -.Ar parameter -is set, its value is substituted. -.It Li ${ Ns Ar parameter Ns Ic :+ Ns Ar word Ns Li } -.Sy Use Alternative Value. -If -.Ar parameter -is unset or null, null is substituted; -otherwise, the expansion of -.Ar word -is substituted. -The value of -.Ar parameter -.Em is not used -in this expansion. -.It Li ${ Ns Ic # Ns Ar parameter Ns Li } -.Sy String Length. -The length in characters of the value of -.Ar parameter . -.El -.Pp -The following four varieties of parameter expansion provide for substring -processing. -In each case, pattern matching notation (see -.Sx Shell Patterns ) , -rather than regular expression notation, is used to evaluate the patterns. -If parameter is -.Dv * -or -.Dv @ , \" $@ -the result of the expansion is unspecified. -Enclosing the full parameter expansion string in double quotes does not -cause the following four varieties of pattern characters to be quoted, -whereas quoting characters within the braces has this effect. -.Bl -tag -width aaparameterwordaaaaa -.It Li ${ Ns Ar parameter Ns Ic % Ns Ar word Ns Li } -.Sy Remove Smallest Suffix Pattern. -The -.Ar word -is expanded to produce a pattern. -The parameter expansion then results in -.Ar parameter , -with the -smallest portion of the suffix matched by the pattern deleted. -If the -.Ar word -is to start with a -.Sq Li \&% -character, it must be quoted. -.It Li ${ Ns Ar parameter Ns Ic %% Ns Ar word Ns Li } -.Sy Remove Largest Suffix Pattern. -The -.Ar word -is expanded to produce a pattern. -The parameter expansion then results in -.Ar parameter , -with the largest -portion of the suffix matched by the pattern deleted. -The -.Dq Ic %% -pattern operator only produces different results from the -.Dq Ic \&% -operator when the pattern contains at least one unquoted -.Sq Li \&* . -.It Li ${ Ns Ar parameter Ns Ic \&# Ns Ar word Ns Li } -.Sy Remove Smallest Prefix Pattern. -The -.Ar word -is expanded to produce a pattern. -The parameter expansion then results in -.Ar parameter , -with the -smallest portion of the prefix matched by the pattern deleted. -If the -.Ar word -is to start with a -.Sq Li \&# -character, it must be quoted. -.It Li ${ Ns Ar parameter Ns Ic \&## Ns Ar word Ns Li } -.Sy Remove Largest Prefix Pattern. -The -.Ar word -is expanded to produce a pattern. -The parameter expansion then results in -.Ar parameter , -with the largest -portion of the prefix matched by the pattern deleted. -This has the same relationship with the -.Dq Ic \&# -pattern operator as -.Dq Ic %% -has with -.Dq Ic \&% . -.El -.\" -.\" -.Ss Command Substitution -.\" -Command substitution allows the output of a command to be substituted in -place of the command (and surrounding syntax). -Command substitution occurs when a word contains -a command list enclosed as follows: -.Pp -.Dl Ic $( Ns Ar list Ns Ic \&) -.Pp -or the older -.Pq Dq backquoted -version, which is best avoided: -.Pp -.Dl Ic \&` Ns Ar list Ns Ns Ic \&` -.Pp -See the section -.Sx Complex Commands -above for the definition of -.Ic list . -.Pp -The shell expands the command substitution by executing the -.Ar list -in a sub-shell environment and replacing the command substitution with the -standard output of the -.Ar list -after removing any sequence of one or more -.Ao newline Ac Ns s -from the end of the substitution. -(Embedded -.Ao newline Ac Ns s -before -the end of the output are not removed; however, during field splitting, -they may be used to separate fields -.Pq "as spaces usually are" -depending on the value of -.Ev IFS -and any quoting that is in effect.) -.Pp -Note that if a command substitution includes commands -to be run in the background, -the sub-shell running those commands -will only wait for them to complete if an appropriate -.Ic wait -command is included in the command list. -However, the shell in which the result of the command substitution -will be used will wait for both the sub-shell to exit and for the -file descriptor that was initially standard output for the command -substitution sub-shell to be closed. -In some circumstances this might not happen until all processes -started by the command substitution have finished. -.\" While the exit of the sub-shell closes its standard output, -.\" any background process left running may still -.\" have that file descriptor open. -.\" This includes yet another sub-shell which might have been -.\" (almost invisibly) created to wait for some other command to complete, -.\" and even where the background command has had its -.\" standard output redirected or closed, -.\" the waiting sub-shell may still have it open. -.\" Thus there is no guarantee that the result of a command substitution -.\" will be available in the shell which is to use it before all of -.\" the commands started by the command substitution have completed, -.\" though careful coding can often avoid delays beyond the termination -.\" of the command substitution sub-shell. -.\" .Pp -.\" For example, assuming a script were to contain the following -.\" code (which could be done better other ways, attempting -.\" this kind of trickery is not recommended): -.\" .Bd -literal -offset indent -.\" if [ "$( printf "Ready? " >&2; read ans; printf "${ans}"; -.\" { sleep 120 >/dev/null && kill $$ >/dev/null 2>&1; }& )" = go ] -.\" then -.\" printf Working... -.\" # more code -.\" fi -.\" .Ed -.\" .Pp -.\" the -.\" .Dq Working... -.\" output will not be printed, and code that follows will never be executed. -.\" Nor will anything later in the script -.\" .Po -.\" unless -.\" .Dv SIGTERM -.\" is trapped or ignored -.\" .Pc . -.\" .Pp -.\" The intent is to prompt the user, wait for the user to -.\" answer, then if the answer was -.\" .Dq go -.\" do the appropriate work, but set a 2 minute time limit -.\" on completing that work. -.\" If the work is not done by then, kill the shell doing it. -.\" .Pp -.\" It will usually not work as written, as while the 2 minute -.\" .Sq sleep -.\" has its standard output redirected, as does the -.\" .Sq kill -.\" that follows (which also redirects standard error, -.\" so the user would not see an error if the work were -.\" completed and there was no parent process left to kill); -.\" the sub-shell waiting for the -.\" .Sq sleep -.\" to finish successfully, so it can start the -.\" .Sq kill , -.\" does not. -.\" It waits, with standard output still open, -.\" for the 2 minutes until the sleep is done, -.\" even though the kill is not going to need that file descriptor, -.\" and there is nothing else which could. -.\" The command substitution does not complete until after -.\" the kill has executed and the background sub-shell -.\" finishes \(en at which time the shell running it is -.\" presumably dead. -.\" .Pp -.\" Rewriting the background sub-shell part of that as -.\" .Dl "{ sleep 120 && kill $$ 2>&1; } >/dev/null &" -.\" would allow this -.\" .Nm -.\" to perform as expected, but that is not guaranteed, -.\" not all shells would behave as planned. -.\" It is advised to avoid starting background processes -.\" from within a command substitution. -.\" -.\" -.Ss Arithmetic Expansion -.\" -Arithmetic expansion provides a mechanism for evaluating an arithmetic -expression and substituting its value. -The format for arithmetic expansion is as follows: -.Pp -.Dl Ic $(( Ns Ar expression Ns Ic \&)) -.Pp -The expression in an arithmetic expansion is treated as if it were in -double quotes, except that a double quote character inside the expression -is just a normal character (it quotes nothing.) -The shell expands all tokens in the expression for parameter expansion, -command substitution, and quote removal (the only quoting character is -the backslash -.Sq \&\e , -and only when followed by another -.Sq \&\e , -a dollar sign -.Sq \&$ , -a backquote -.Sq \&` -or a newline.) -.Pp -Next, the shell evaluates the expanded result as an arithmetic expression -and substitutes the calculated value of that expression. -.Pp -Arithmetic expressions use a syntax similar to that -of the C language, and are evaluated using the -.Ql intmax_t -data type (this is an extension to POSIX, which requires only -.Ql long -arithmetic.) -Shell variables may be referenced by name inside an arithmetic -expression, without needing a -.Dq \&$ -sign. -Variables that are not set, or which have an empty (null string) value, -used this way evaluate as zero (that is, -.Dq x -in arithmetic, as an R-Value, is evaluated as -.Dq ${x:-0} ) -unless the -.Nm -.Fl u -flag is set, in which case a reference to an unset variable is an error. -Note that unset variables used in the ${var} form expand to a null -string, which might result in syntax errors. -Referencing the value of a variable which is not numeric is an error. -.Pp -All of the C expression operators applicable to integers are supported, -and operate as they would in a C expression. -Use white space, or parentheses, to disambiguate confusing syntax, -otherwise, as in C, the longest sequence of consecutive characters -which make a valid token (operator, variable name, or number) is taken -to be that token, even if the token designated cannot be used -and a different interpretation could produce a successful parse. -This means, as an example, that -.Dq a+++++b -is parsed as the gibberish sequence -.Dq "a ++ ++ + b" , -rather than as the valid alternative -.Dq "a ++ + ++ b" . -Similarly, separate the -.Sq \&, -operator from numbers with white space to avoid the possibility -of confusion with the decimal indicator in some locales (though -fractional, or floating-point, numbers are not supported in this -implementation.) -.Pp -It should not be necessary to state that the C operators which -operate on, or produce, pointer types, are not supported. -Those include unary -.Dq \&* -and -.Dq \&& -and the struct and array referencing binary operators: -.Dq \&. , -.Dq \&-> -and -.Dq \&[ . -.\" -.\" -.Ss White Space Splitting (Field Splitting) -.\" -After parameter expansion, command substitution, and -arithmetic expansion the shell scans the results of -expansions and substitutions that did not occur in double quotes, -and -.Dq Li $@ -even if it did, -for field splitting and multiple fields can result. -.Pp -The shell treats each character of the -.Ev IFS -as a delimiter and uses the delimiters to split the results of parameter -expansion and command substitution into fields. -.Pp -Non-whitespace characters in -.Ev IFS -are treated strictly as parameter separators. -So adjacent non-whitespace -.Ev IFS -characters will produce empty parameters. -On the other hand, any sequence of whitespace -characters that occur in -.Ev IFS -(known as -.Ev IFS -whitespace) -can occur, leading and trailing -.Ev IFS -whitespace, and any -.Ev IFS -whitespace surrounding a non whitespace -.Ev IFS -delimiter, is removed. -Any sequence of -.Ev IFS -whitespace characters without a non-whitespace -.Ev IFS -delimiter acts as a single field separator. -.Pp -If -.Ev IFS -is unset it is assumed to contain space, tab, and newline, -all of which are -.Ev IFS -whitespace characters. -If -.Ev IFS -is set to a null string, there are no delimiters, -and no field splitting occurs. -.Ss Pathname Expansion (File Name Generation) -Unless the -.Fl f -flag is set, file name generation is performed after word splitting is -complete. -Each word is viewed as a series of patterns, separated by slashes. -The process of expansion replaces the word with the names of all -existing files whose names can be formed by replacing each pattern with a -string that matches the specified pattern. -There are two restrictions on -this: first, a pattern cannot match a string containing a slash, and -second, a pattern cannot match a string starting with a period unless the -first character of the pattern is a period. -The next section describes the -patterns used for both Pathname Expansion and the -.Ic case -command. -.Ss Shell Patterns -A pattern consists of normal characters, which match themselves, -and meta-characters. -The meta-characters are -.Dq \&! , -.Dq * , -.Dq \&? , -and -.Dq \&[ . -These characters lose their special meanings if they are quoted. -When command or variable substitution is performed -and the dollar sign or backquotes are not double-quoted, -the value of the variable or the output of -the command is scanned for these characters and they are turned into -meta-characters. -.Pp -An asterisk -.Pq Dq * -matches any string of characters. -A question mark -.Pq Dq \&? -matches any single character. -A left bracket -.Pq Dq \&[ -introduces a character class. -The end of the character class is indicated by a right bracket -.Pq Dq \&] ; -if this -.Dq \&] -is missing then the -.Dq \&[ -matches a -.Dq \&[ -rather than introducing a character class. -A character class matches any of the characters between the square brackets. -A named class of characters (see -.Xr wctype 3 ) -may be specified by surrounding the name with -.Pq Dq [: -and -.Pq Dq :] . -For example, -.Pq Dq [[:alpha:]] -is a shell pattern that matches a single letter. -A range of characters may be specified using a minus sign -.Pq Dq \(mi . -The character class may be complemented -by making an exclamation mark -.Pq Dq \&! -the first character of the character class. -.Pp -To include a -.Dq \&] -in a character class, make it the first character listed (after the -.Dq \&! , -if any). -To include a -.Dq \(mi , -make it the first (after !) or last character listed. -If both -.Dq \&] -and -.Dq \(mi -are to be included, the -.Dq \&] -must be first (after !) -and the -.Dq \(mi -last, in the character class. -.\" -.\" -.Ss Built-ins -.\" -This section lists the built-in commands which are built-in because they -need to perform some operation that can't be performed by a separate -process. -Or just because they traditionally are. -In addition to these, there are several other commands that may -be built in for efficiency (e.g. -.Xr printf 1 , -.Xr echo 1 , -.Xr test 1 , -etc). -.Bl -tag -width 5n -.It Ic \&: Op Ar arg ... -A null command that returns a 0 (true) exit value. -Any arguments or redirects are evaluated, then ignored. -.\" -.It Ic \&. Ar file -The dot command reads and executes the commands from the specified -.Ar file -in the current shell environment. -The file does not need to be executable and is looked up from the directories -listed in the -.Ev PATH -variable if its name does not contain a directory separator -.Pq Sq / . -The -.Ic return -command (see below) -can be used for a premature return from the sourced file. -.Pp -The POSIX standard has been unclear on how loop control keywords (break -and continue) behave across a dot command boundary. -This implementation allows them to control loops surrounding the dot command, -but obviously such behavior should not be relied on. -It is now permitted by the standard, but not required. -.\" -.It Ic alias Op Ar name Ns Op Li = Ns Ar string ... -If -.Ar name Ns Li = Ns Ar string -is specified, the shell defines the alias -.Ar name -with value -.Ar string . -If just -.Ar name -is specified, the value of the alias -.Ar name -is printed. -With no arguments, the -.Ic alias -built-in prints the -names and values of all defined aliases (see -.Ic unalias ) . -.\" -.It Ic bg Op Ar job ... -Continue the specified jobs (or the current job if no -jobs are given) in the background. -.\" -.It Ic command Oo Fl pVv Oc Ar command Op Ar arg ... -Execute the specified command but ignore shell functions when searching -for it. -(This is useful when you -have a shell function with the same name as a command.) -.Bl -tag -width 5n -.It Fl p -search for command using a -.Ev PATH -that guarantees to find all the standard utilities. -.It Fl V -Do not execute the command but -search for the command and print the resolution of the -command search. -This is the same as the -.Ic type -built-in. -.It Fl v -Do not execute the command but -search for the command and print the absolute pathname -of utilities, the name for built-ins or the expansion of aliases. -.El -.\" -.It Ic cd Oo Fl P Oc Op Ar directory Op Ar replace -Switch to the specified directory (default -.Ev $HOME ) . -If -.Ar replace -is specified, then the new directory name is generated by replacing -the first occurrence of the string -.Ar directory -in the current directory name with -.Ar replace . -Otherwise if -.Ar directory -is -.Sq Li - , -then the current working directory is changed to the previous current -working directory as set in -.Ev OLDPWD . -Otherwise if an entry for -.Ev CDPATH -appears in the environment of the -.Ic cd -command or the shell variable -.Ev CDPATH -is set and the directory name does not begin with a slash, -and its first (or only) component isn't dot or dot dot, -then the directories listed in -.Ev CDPATH -will be searched for the specified directory. -The format of -.Ev CDPATH -is the same as that of -.Ev PATH . -.Pp -The -.Fl P -option instructs the shell to update -.Ev PWD -with the specified physical directory path and change to that directory. -This is the default. -.Pp -When the directory changes, the variable -.Ev OLDPWD -is set to the working directory before the change. -.Pp -Some shells also support a -.Fl L -option, which instructs the shell to update -.Ev PWD -with the logical path and to change the current directory -accordingly. -This is not supported. -.Pp -In an interactive shell, the -.Ic cd -command will print out the name of the -directory that it actually switched to if this is different from the name -that the user gave, -or always if the -.Cm cdprint -option is set. -The destination may be different either because the -.Ev CDPATH -mechanism was used -.\" or because a symbolic link was crossed. -or if the -.Ar replace -argument was used. -.\" -.It Ic eval Ar string ... -Concatenate all the arguments with spaces. -Then re-parse and execute the command. -.\" -.It Ic exec Op Ar command Op Ar arg ... -Unless -.Ar command -is omitted, the shell process is replaced with the -specified program (which must be a real program, not a shell built-in or -function). -Any redirections on the -.Ic exec -command are marked as permanent, so that they are not undone when the -.Ic exec -command finishes. -When the -.Cm posix -option is not set, -file descriptors created via such redirections are marked close-on-exec -(see -.Xr open 2 -.Dv O_CLOEXEC -or -.Xr fcntl 2 -.Dv F_SETFD / -.Dv FD_CLOEXEC ) , -unless the descriptors refer to the standard input, -output, or error (file descriptors 0, 1, 2). -Traditionally Bourne-like shells -(except -.Xr ksh 1 ) , -made those file descriptors available to exec'ed processes. -To be assured the close-on-exec setting is off, -redirect the descriptor to (or from) itself, -either when invoking a command for which the descriptor is wanted open, -or by using -.Ic exec -(perhaps the same -.Ic exec -as opened it, after the open) -to leave the descriptor open in the shell -and pass it to all commands invoked subsequently. -Alternatively, see the -.Ic fdflags -command below, which can set, or clear, this, and other, -file descriptor flags. -.\" -.It Ic exit Op Ar exitstatus -Terminate the shell process. -If -.Ar exitstatus -is given it is used as the exit status of the shell; otherwise the -exit status of the preceding command (the current value of $?) is used. -.\" -.It Ic export Oo Fl nx Oc Ar name Ns Oo =value Oc ... -.It Ic export Oo Fl x Oc Oo Fl p Oo Ar name ... Oc Oc -.It Ic export Fl q Oo Fl x Oc Ar name ... -With no options, -but one or more names, -the specified names are exported so that they will appear in the -environment of subsequent commands. -With -.Fl n -the specified names are un-exported. -Variables can also be un-exported using the -.Ic unset -built in command. -With -.Fl x -(exclude) the specified names are marked not to be exported, -and any that had been exported, will be un-exported. -Later attempts to export the variable will be refused. -Note this does not prevent explicitly exporting a variable -to a single command, script or function by preceding that -command invocation by a variable assignment to that variable, -provided the variable is not also read-only. -That is -.Bd -literal -offset indent -export -x FOO # FOO will now not be exported by default -export FOO # this command will fail (non-fatally) -FOO=some_value my_command -.Ed -.Pp -still passes the value -.Pq Li FOO=some_value -to -.Li my_command -through the environment. -.Pp -The shell allows the value of a variable to be set at the -same time it is exported (or unexported, etc) by writing -.Pp -.Dl export [-nx] name=value -.Pp -With no arguments the export command lists the names of all -set exported variables, -or if -.Fl x -was given, all set variables marked not for export. -With the -.Fl p -option specified, the output will be formatted suitably for -non-interactive use, and unset variables are included. -When -.Fl p -is given, variable names, but not values, may also be -given, in which case output is limited to the variables named. -.Pp -With -.Fl q -and a list of variable names, the -.Ic export -command will exit with status 0 if all the named -variables have been marked for export, or 1 if -any are not so marked. -If -.Fl x -is also given, -the test is instead for variables marked not to be exported. -.Pp -Other than with -.Fl q , -the -.Ic export -built-in exits with status 0, -unless an attempt is made to export a variable which has -been marked as unavailable for export, -in which cases it exits with status 1. -In all cases if -an invalid option, or option combination, is given, -or an invalid variable name is present, -.Ic export -will write a message to the standard error output, -and exit with a non-zero status. -A non-interactive shell will terminate. -.Pp -Note that there is no restriction upon exporting, -or un-exporting, read-only variables. -The no-export flag can be reset by unsetting the variable -and creating it again \(en provided the variable is not also read-only. -.\" -.It Ic fc Oo Fl e Ar editor Oc Op Ar first Op Ar last -.It Ic fc Fl l Oo Fl nr Oc Op Ar first Op Ar last -.It Ic fc Fl s Oo Ar old=new Oc Op Ar first -The -.Ic fc -built-in lists, or edits and re-executes, commands previously entered -to an interactive shell. -.Bl -tag -width 5n -.It Fl e Ar editor -Use the editor named by -.Ar editor -to edit the commands. -The -.Ar editor -string is a command name, subject to search via the -.Ev PATH -variable. -The value in the -.Ev FCEDIT -variable is used as a default when -.Fl e -is not specified. -If -.Ev FCEDIT -is null or unset, the value of the -.Ev EDITOR -variable is used. -If -.Ev EDITOR -is null or unset, -.Xr ed 1 -is used as the editor. -.It Fl l No (ell) -List the commands rather than invoking an editor on them. -The commands are written in the sequence indicated by -the first and last operands, as affected by -.Fl r , -with each command preceded by the command number. -.It Fl n -Suppress command numbers when listing with -.Fl l . -.It Fl r -Reverse the order of the commands listed (with -.Fl l ) -or edited (with neither -.Fl l -nor -.Fl s ) . -.It Fl s -Re-execute the command without invoking an editor. -.It Ar first -.It Ar last -Select the commands to list or edit. -The number of previous commands that -can be accessed are determined by the value of the -.Ev HISTSIZE -variable. -The value of -.Ar first -or -.Ar last -or both are one of the following: -.Bl -tag -width 5n -.It Oo Cm + Oc Ns Ar number -A positive number representing a command number; command numbers can be -displayed with the -.Fl l -option. -.It Cm \- Ns Ar number -A negative decimal number representing the command that was executed -number of commands previously. -For example, \-1 is the immediately previous command. -.El -.It Ar string -A string indicating the most recently entered command that begins with -that string. -If the -.Ar old Ns Li = Ns Ar new -operand is not also specified with -.Fl s , -the string form of the first operand cannot contain an embedded equal sign. -.El -.Pp -The following environment variables affect the execution of -.Ic fc : -.Bl -tag -width HISTSIZE -.It Ev FCEDIT -Name of the editor to use. -.It Ev HISTSIZE -The number of previous commands that are accessible. -.El -.\" -.It Ic fg Op Ar job -Move the specified job or the current job to the foreground. -A foreground job can interact with the user via standard input, -and receive signals from the terminal. -.\" -.It Ic fdflags Oo Fl v Oc Op Ar fd ... -.It Ic fdflags Oo Fl v Oc Fl s Ar flags fd Op ... -Get or set file descriptor flags. -The -.Fl v -argument enables verbose printing, printing flags that are also off, and -the flags of the file descriptor being set after setting. -The -.Fl s -flag interprets the -.Ar flags -argument as a comma separated list of file descriptor flags, each preceded -with a -.Dq \(pl -or a -.Dq \(mi -indicating to set or clear the respective flag. -Valid flags are: -.Cm append , -.Cm async , -.Cm sync , -.Cm nonblock , -.Cm fsync , -.Cm dsync , -.Cm rsync , -.Cm direct , -.Cm nosigpipe , -and -.Cm cloexec . -Unique abbreviations of these names, of at least 2 characters, -may be used on input. -See -.Xr fcntl 2 -and -.Xr open 2 -for more information. -.\" -.It Ic getopts Ar optstring var -The POSIX -.Ic getopts -command, not to be confused with the -Bell Labs\[en]derived -.Xr getopt 1 . -.Pp -The first argument should be a series of letters, each of which may be -optionally followed by a colon to indicate that the option requires an -argument. -The variable specified is set to the parsed option. -.Pp -The -.Ic getopts -command deprecates the older -.Xr getopt 1 -utility due to its handling of arguments containing whitespace. -.Pp -The -.Ic getopts -built-in may be used to obtain options and their arguments -from a list of parameters. -When invoked, -.Ic getopts -places the value of the next option from the option string in the list in -the shell variable specified by -.Ar var -and its index in the shell variable -.Ev OPTIND . -When the shell is invoked, -.Ev OPTIND -is initialized to 1. -For each option that requires an argument, the -.Ic getopts -built-in will place it in the shell variable -.Ev OPTARG . -If an option is not allowed for in the -.Ar optstring , -then -.Ev OPTARG -will be unset. -.Pp -.Ar optstring -is a string of recognized option letters (see -.Xr getopt 3 ) . -If a letter is followed by a colon, the option is expected to have an -argument which may or may not be separated from it by whitespace. -If an option character is not found where expected, -.Ic getopts -will set the variable -.Ar var -to a -.Sq Li \&? ; -.Ic getopts -will then unset -.Ev OPTARG -and write output to standard error. -By specifying a colon as the first character of -.Ar optstring -all errors will be ignored. -.Pp -A nonzero value is returned when the last option is reached. -If there are no remaining arguments, -.Ic getopts -will set -.Ar var -to the special option, -.Dq Li \-\- , -otherwise, it will set -.Ar var -to -.Sq Li \&? . -.Pp -The following code fragment shows how one might process the arguments -for a command that can take the options -.Fl a -and -.Fl b , -and the option -.Fl c , -which requires an argument. -.Bd -literal -offset indent -while getopts abc: f -do - case $f in - a | b) flag=$f;; - c) carg=$OPTARG;; - \e?) echo $USAGE; exit 1;; - esac -done -shift $((OPTIND - 1)) -.Ed -.Pp -This code will accept any of the following as equivalent: -.Bd -literal -offset indent -cmd \-acarg file file -cmd \-a \-c arg file file -cmd \-carg -a file file -cmd \-a \-carg \-\- file file -.Ed -.\" -.It Ic hash Oo Fl rv Oc Op Ar command ... -The shell maintains a hash table which remembers the -locations of commands. -With no arguments whatsoever, -the -.Ic hash -command prints out the contents of this table. -Entries which have not been looked at since the last -.Ic cd -command are marked with an asterisk; it is possible for these entries -to be invalid. -.Pp -With arguments, the -.Ic hash -command removes the specified commands from the hash table (unless -they are functions) and then locates them. -With the -.Fl v -option, hash prints the locations of the commands as it finds them. -The -.Fl r -option causes the hash command to delete all the entries in the hash table -except for functions. -.\" -.It Ic inputrc Ar file -Read the -.Ar file -to set key bindings as defined by -.Xr editrc 5 . -.\" -.It Ic jobid Oo Fl g Ns \&| Ns Fl j Ns \&| Ns Fl p Oc Op Ar job -With no flags, print the process identifiers of the processes in the job. -If the -.Ar job -argument is omitted, the current job is used. -Any of the ways to select a job may be used for -.Ar job , -including the -.Sq Li \&% -forms, or the process id of the job leader -.Po -.Dq Li \&$! -if the job was created in the background. -.Pc -.Pp -If one of the flags is given, then instead of the list of -process identifiers, the -.Ic jobid -command prints: -.Bl -tag -width ".Fl g" -.It Fl g -the process group, if one was created for this job, -or nothing otherwise (the job is in the same process -group as the shell.) -.It Fl j -the job identifier (using -.Dq Li \&% Ns Ar n -notation, where -.Ar n -is a number) is printed. -.It Fl p -only the process id of the process group leader is printed. -.El -.Pp -These flags are mutually exclusive. -.Pp -.Ic jobid -exits with status 2 if there is an argument error, -status 1, if with -.Fl g -the job had no separate process group, -or with -.Fl p -there is no process group leader (should not happen), -and otherwise exits with status 0. -.\" -.It Ic jobs Oo Fl l Ns \&| Ns Fl p Oc Op Ar job ... -Without -.Ar job -arguments, -this command lists out all the background processes -which are children of the current shell process. -With -.Ar job -arguments, the listed jobs are shown instead. -Without flags, the output contains the job -identifier (see -.Sx Job Control -below), an indicator character if the job is the current or previous job, -the current status of the job (running, suspended, or terminated successfully, -unsuccessfully, or by a signal) -and a (usually abbreviated) command string. -.Pp -With the -.Fl l -flag the output is in a longer form, with the process identifiers -of each process (run from the top level, as in a pipeline), and the -status of each process, rather than the job status. -.Pp -With the -.Fl p -flag, the output contains only the process identifier of the lead -process. -.Pp -In an interactive shell, each job shown as completed in the output -from the jobs command is implicitly waited for, and is removed from -the jobs table, never to be seen again. -In an interactive shell, when a background job terminates, the -.Ic jobs -command (with that job as an argument) is implicitly run just -before outputting the next PS1 command prompt, after the job -terminated. -This indicates that the job finished, shows its status, -and cleans up the job table entry for that job. -Non-interactive shells need to execute -.Ic wait -commands to clean up terminated background jobs. -.\" -.It Ic local Oo Fl INx Oc Oo Ar variable | \- Oc ... -Define local variables for a function. -Local variables have their attributes, and values, -as they were before the -.Ic local -declaration, restored when the function terminates. -.Pp -With the -.Fl N -flag, variables made local, are unset initially inside -the function. -Unless the -.Fl x -flag is also given, such variables are also unexported. -The -.Fl I -flag, which is the default in this shell, causes -the initial value and exported attribute -of local variables -to be inherited from the variable -with the same name in the surrounding -scope, if there is one. -If there is not, the variable is initially unset, -and not exported. -The -.Fl N -and -.Fl I -flags are mutually exclusive, if both are given, the last specified applies. -The read-only and unexportable attributes are always -inherited, if a variable with the same name already exists. -.Pp -The -.Fl x -flag (lower case) causes the local variable to be exported, -while the function runs, unless it has the unexportable attribute. -This can also be accomplished by using the -.Ic export -command, giving the same -.Ar variable -names, after the -.Ic local -command. -.Pp -Making an existing read-only variable local is possible, -but pointless. -If an attempt is made to assign an initial value to such -a variable, the -.Ic local -command fails, as does any later attempted assignment. -If the -.Ic readonly -command is applied to a variable that has been declared local, -the variable cannot be (further) modified within the function, -or any other functions it calls, however when the function returns, -the previous status (and value) of the variable is returned. -.Pp -Values may be given to local variables on the -.Ic local -command line in a similar fashion as used for -.Ic export -and -.Ic readonly . -These values are assigned immediately after the initialization -described above. -Note that any variable references on the command line will have -been expanded before -.Ic local -is executed, so expressions like -.Pp -.Dl "local -N X=${X}" -.Pp -are well defined, first $X is expanded, and then the command run is -.Pp -.Dl "local -N X=old-value-of-X" -.Pp -After arranging to preserve the old value and attributes, of -.Dv X -.Dq ( old-value-of X ) -.Ic local -unsets -.Dv X , -unexports it, and then assigns the -.Dq old-value-of-X -to -.Ev X . -.Pp -The shell uses dynamic scoping, so that if you make the variable -.Dv x -local to -function -.Dv f , -which then calls function -.Dv g , -references to the variable -.Dv x -made inside -.Dv g -will refer to the variable -.Dv x -declared inside -.Dv f , -not to the global variable named -.Dv x . -.Pp -Another way to view this, is as if the shell just has one flat, global, -namespace, in which all variables exist. -The -.Ic local -command conceptually copies the variable(s) named to unnamed temporary -variables, and when the function ends, copies them back again. -All references to the variables reference the same global variables, -but while the function is active, after the -.Ic local -command has run, the values and attributes of the variables might -be altered, and later, when the function completes, be restored. -.Pp -Note that the positional parameters -.Dv 1 , \" $1 -.Dv 2 , \" $2 -\&... (see -.Sx Positional Parameters ) , -and the special parameters -.Dv \&# , \" $# -.Dv \&* \" $* -and -.Dv \&@ \" $@ -(see -.Sx Special Parameters ) , -are always made local in all functions, and are reset inside the -function to represent the options and arguments passed to the function. -Note that -.Li $0 -however retains the value it had outside the function, -as do all the other special parameters. -.Pp -The only special parameter that can optionally be made local is -.Dq Li \- . -Making -.Dq Li \- -local causes any shell options that are changed via the set command inside the -function to be restored to their original values when the function -returns. -If -.Fl X -option is altered after -.Dq Li \- -has been made local, then when the function returns, the previous -destination for -.Cm xtrace -output (as of the time of the -.Ic local -command) will also be restored. -If any of the shell's magic variables -(those which return a value which may vary without -the variable being explicitly altered, -e.g.: -.Dv SECONDS -or -.Dv HOSTNAME ) -are made local in a function, -they will lose their special properties when set -within the function, including by the -.Ic local -command itself -(if not to be set in the function, there is little point -in making a variable local) -but those properties will be restored when the function returns. -.Pp -It is an error to use -.Ic local -outside the scope of a function definition. -When used inside a function, it exits with status 0, -unless an undefined option is used, or an attempt is made to -assign a value to a read-only variable. -.Pp -Note that either -.Fl I -or -.Fl N -should always be used, or variables made local should always -be given a value, or explicitly unset, as the default behavior -(inheriting the earlier value, or starting unset after -.Ic local ) -differs amongst shell implementations. -Using -.Dq Li local \&\- -is an extension not implemented by most shells. -.Pp -See the section -.Sx LINENO -below for details of the effects of making the variable -.Dv LINENO -local. -.\" -.It Ic pwd Op Fl \&LP -Print the current directory. -If -.Fl L -is specified the cached value (initially set from -.Ev PWD ) -is checked to see if it refers to the current directory; if it does -the value is printed. -Otherwise the current directory name is found using -.Xr getcwd 3 . -The environment variable -.Ev PWD -is set to the printed value. -.Pp -The default is -.Ic pwd -.Fl L , -but note that the built-in -.Ic cd -command doesn't support the -.Fl L -option and will cache (almost) the absolute path. -If -.Ic cd -is changed (as unlikely as that is), -.Ic pwd -may be changed to default to -.Ic pwd -.Fl P . -.Pp -If the current directory is renamed and replaced by a symlink to the -same directory, or the initial -.Ev PWD -value followed a symbolic link, then the cached value may not -be the absolute path. -.Pp -The built-in command may differ from the program of the same name because -the program will use -.Ev PWD -and the built-in uses a separately cached value. -.\" -.It Ic read Oo Fl p Ar prompt Oc Oo Fl r Oc Ar variable Op Ar ... -The -.Ar prompt -is printed if the -.Fl p -option is specified and the standard input is a terminal. -Then a line is read from the standard input. -The trailing newline is deleted from the -line and the line is split as described in the field splitting section of the -.Sx Word Expansions -section above, and the pieces are assigned to the variables in order. -If there are more pieces than variables, the remaining pieces -(along with the characters in -.Ev IFS -that separated them) are assigned to the last variable. -If there are more variables than pieces, -the remaining variables are assigned the null string. -The -.Ic read -built-in will indicate success unless EOF is encountered on input, in -which case failure is returned. -.Pp -By default, unless the -.Fl r -option is specified, the backslash -.Dq \e -acts as an escape character, causing the following character to be treated -literally. -If a backslash is followed by a newline, the backslash and the -newline will be deleted. -.\" -.It Ic readonly Ar name Ns Oo =value Oc ... -.It Ic readonly Oo Fl p Oo Ar name ... Oc Oc -.It Ic readonly Fl q Ar name ... -With no options, -the specified names are marked as read only, so that they cannot be -subsequently modified or unset. -The shell allows the value of a variable -to be set at the same time it is marked read only by writing -.Pp -.Dl readonly name=value -.Pp -With no arguments the -.Ic readonly -command lists the names of all set read only variables. -With the -.Fl p -option specified, -the output will be formatted suitably for non-interactive use, -and unset variables are included. -When the -.Fl p -option is given, -a list of variable names (without values) may also be specified, -in which case output is limited to the named variables. -.Pp -With the -.Fl q -option, the -.Ic readonly -command tests the read-only status of the variables listed -and exits with status 0 if all named variables are read-only, -or with status 1 if any are not read-only. -.Pp -Other than as specified for -.Fl q -the -.Ic readonly -command normally exits with status 0. -In all cases, if an unknown option, or an invalid option combination, -or an invalid variable name, is given; -or a variable which was already read-only is attempted to be set; -the exit status will not be zero, a diagnostic -message will be written to the standard error output, -and a non-interactive shell will terminate. -.\" -.It Ic return Op Ar n -Stop executing the current function or a dot command with return value of -.Ar n -or the value of the last executed command, if not specified. -For portability, -.Ar n -should be in the range from 0 to 255. -.Pp -The POSIX standard says that the results of -.Ic return -outside a function or a dot command are unspecified. -This implementation treats such a return as a no-op with a return value of 0 -(success, true). -Use the -.Ic exit -command instead, if you want to return from a script or exit -your shell. -.\" -.It Ic set Oo { Fl options | Cm +options | Cm \-- } Oc Ar arg ... -The -.Ic set -command performs four different functions. -.Pp -With no arguments, it lists the values of all shell variables. -.Pp -With a single option of either -.Dq Fl o -or -.Dq Cm +o -.Ic set -outputs the current values of the options. -In the -.Fl o -form, all options are listed, with their current values. -In the -.Cm +o -form, the shell outputs a string that can later be used -as a command to reset all options to their current values. -.Pp -If options are given, it sets the specified option -flags, or clears them as described in the -.Sx Argument List Processing -section. -In addition to the options listed there, -when the -.Dq "option name" -given to -.Ic set Fl o -is -.Cm default -all of the options are reset to the values they had immediately -after -.Nm -initialization, before any startup scripts, or other input, had been processed. -While this may be of use to users or scripts, its primary purpose -is for use in the output of -.Dq Ic set Cm +o , -to avoid that command needing to list every available option. -There is no -.Cm +o default . -.Pp -The fourth use of the -.Ic set -command is to set the values of the shell's -positional parameters to the specified arguments. -To change the positional -parameters without changing any options, use -.Dq -\|- -as the first argument to -.Ic set . -If no following arguments are present, the -.Ic set -command -will clear all the positional parameters (equivalent to executing -.Dq Li shift $# . ) -Otherwise the following arguments become -.Li \&$1 , -.Li \&$2 , -\&..., -and -.Li \&$# -is set to the number of arguments present. -.\" -.It Ic setvar Ar variable Ar value -Assigns -.Ar value -to -.Ar variable . -(In general it is better to write -.Li variable=value -rather than using -.Ic setvar . -.Ic setvar -is intended to be used in -functions that assign values to variables whose names are passed as -parameters.) -.\" -.It Ic shift Op Ar n -Shift the positional parameters -.Ar n -times. -If -.Ar n -is omitted, 1 is assumed. -Each -.Ic shift -sets the value of -.Li $1 -to the previous value of -.Li $2 , -the value of -.Li $2 -to the previous value of -.Li $3 , -and so on, decreasing -the value of -.Li $# -by one. -The shift count must be less than or equal to the number of -positional parameters ( -.Dq Li $# ) -before the shift. -.\" -.It Ic times -Prints two lines to standard output. -Each line contains two accumulated time values, expressed -in minutes and seconds (including fractions of a second.) -The first value gives the user time consumed, the second the system time. -.Pp -The first output line gives the CPU and system times consumed by the -shell itself. -The second line gives the accumulated times for children of this -shell (and their descendants) which have exited, and then been -successfully waited for by the relevant parent. -See -.Xr times 3 -for more information. -.Pp -.Ic times -has no parameters, and exits with an exit status of 0 unless -an attempt is made to give it an option. -.\" -.It Ic trap Ar action signal ... -.It Ic trap \- -.It Ic trap Op Fl l -.It Ic trap Oo Fl p Oc Ar signal ... -.It Ic trap Ar N signal ... -.Pp -Cause the shell to parse and execute action when any of the specified -signals are received. -The signals are specified by signal number or as the name of the signal. -If -.Ar signal -is -.Li 0 \" $0 -or its equivalent, -.Li EXIT , -the action is executed when the shell exits. -The -.Ar action -may be a null (empty) string, -which causes the specified signals to be ignored. -With -.Ar action -set to -.Sq Li - -the specified signals are set to their default actions. -If the first -.Ar signal -is specified in its numeric form, then -.Ar action -can be omitted to achieve the same effect. -This archaic, -but still standard, -form should not be relied upon, use the explicit -.Sq Li - -action. -If no signals are specified with an action of -.Sq Li - , -all signals are reset. -.Pp -When the shell forks off a sub-shell, it resets trapped (but not ignored) -signals to the default action. -On non-interactive shells, the -.Ic trap -command has no effect on signals that were -ignored on entry to the shell. -On interactive shells, the -.Ic trap -command will catch or reset signals ignored on entry. -.Pp -Issuing -.Ic trap -with option -.Fl l -will print a list of valid signal names. -.Ic trap -without any arguments causes it to write a list of signals and their -associated non-default actions to the standard output in a format -that is suitable as an input to the shell that achieves the same -trapping results. -With the -.Fl p -flag, trap prints the same information for the signals specified, -or if none are given, for all signals, including those where the -action is the default. -These variants of the trap command may be executed in a sub-shell -.Pq "such as in a command substitution" , -provided they appear as the sole, or first, command in that sub-shell, -in which case the state of traps from the parent of that -sub-shell is reported. -.Pp -Examples: -.Pp -.Dl trap -.Pp -List trapped signals and their corresponding actions. -.Pp -.Dl trap -l -.Pp -Print a list of valid signals. -.Pp -.Dl trap '' INT QUIT tstp 30 -.Pp -Ignore signals INT QUIT TSTP USR1. -.Pp -.Dl trap date INT -.Pp -Run the -.Dq date -command (print the date) upon receiving signal INT. -.Pp -.Dl trap HUP INT -.Pp -Run the -.Dq HUP -command, or function, upon receiving signal INT. -.Pp -.Dl trap 1 2 -.Pp -Reset the actions for signals 1 (HUP) and 2 (INT) to their defaults. -.Bd -literal -offset indent -traps=$(trap -p) - # more commands ... -trap 'action' SIG - # more commands ... -eval "$traps" -.Ed -.Pp -Save the trap status, execute commands, changing some traps, -and then reset all traps to their values at the start of the sequence. -The -.Fl p -option is required in the first command here, -or any signals that were previously -untrapped (in their default states) -and which were altered during the intermediate code, -would not be reset by the final -.Ic eval . -.\" -.It Ic type Op Ar name ... -Interpret each -.Ar name -as a command and print the resolution of the command search. -Possible resolutions are: -shell keyword, alias, shell built-in, -command, tracked alias and not found. -For aliases the alias expansion is -printed; for commands and tracked aliases the complete pathname of the -command is printed. -.\" -.It Ic ulimit Oo Fl H Ns \*(Ba Ns Fl S Oc Op Fl a \*(Ba Fl btfdscmlrpnv Op Ar value -Inquire about or set the hard or soft limits on processes or set new -limits. -The choice between hard limit (which no process is allowed to -violate, and which may not be raised once it has been lowered) and soft -limit (which causes processes to be signaled but not necessarily killed, -and which may be raised) is made with these flags: -.Bl -tag -width Fl -.It Fl H -set or inquire about hard limits -.It Fl S -set or inquire about soft limits. -.El -.Pp -If neither -.Fl H -nor -.Fl S -is specified, the soft limit is displayed or both limits are set. -If both are specified, the last one wins. -.Pp -The limit to be interrogated or set, then, is chosen by specifying -any one of these flags: -.Bl -tag -width Fl -.It Fl a -show all the current limits -.It Fl b -the socket buffer size of a process (bytes) -.It Fl c -the largest core dump size that can be produced -(512-byte blocks) -.It Fl d -the data segment size of a process (kilobytes) -.It Fl f -the largest file that can be created -(512-byte blocks) -.It Fl l -how much memory a process can lock with -.Xr mlock 2 -(kilobytes) -.It Fl m -the total physical memory that can be -in use by a process (kilobytes) -.It Fl n -the number of files a process can have open at once -.It Fl p -the number of processes this user can -have at one time -.It Fl r -the number of threads this user can -have at one time -.It Fl s -the stack size of a process (kilobytes) -.It Fl t -CPU time (seconds) -.It Fl v -how large a process address space can be -.El -.Pp -If none of these is specified, it is the limit on file size that is shown -or set. -If value is specified, the limit is set to that number; otherwise -the current limit is displayed. -.Pp -Limits of an arbitrary process can be displayed or set using the -.Xr sysctl 8 -utility. -.It Ic umask Oo Fl S Oc Op Ar mask -Set the value of umask (see -.Xr umask 2 ) -to the specified octal value. -If the argument is omitted, the umask value is printed. -With -.Fl S -a symbolic form is used instead of an octal number. -.It Ic unalias Oo Fl a Oc Op Ar name -If -.Ar name -is specified, the shell removes that alias. -If -.Fl a -is specified, all aliases are removed. -.It Ic unset Oo Fl efvx Oc Ar name ... -If -.Fl v -is specified, the specified variables are unset and unexported. -Readonly variables cannot be unset. -If -.Fl f -is specified, the specified functions are undefined. -If -.Fl e -is given, the specified variables are unexported, but otherwise unchanged, -alternatively, if -.Fl x -is given, the exported status of the variable will be retained, -even after it is unset. -.Pp -If no flags are provided -.Fl v -is assumed. -If -.Fl f -is given with one of the other flags, -then the named variables will be unset, or unexported, and functions -of the same names will be undefined. -The -.Fl e -and -.Fl x -flags both imply -.Fl v . -If -.Fl e -is given, the -.Fl x -flag is ignored. -.Pp -The exit status is 0, unless an attempt was made to unset -a readonly variable, in which case the exit status is 1. -It is not an error to unset (or undefine) a variable (or function) -that is not currently set (or defined.) -.\" -.It Ic wait Oo Fl n Oc Oo Fl p Ar var Oc Op Ar job ... -Wait for the specified jobs to complete -and return the exit status of the last job in the parameter list, -or 127 if that job is not a current child of the shell. -.Pp -If no -.Ar job -arguments are given, wait for all jobs to -complete and then return an exit status of zero -(including when there were no jobs, and so nothing exited.) -.Pp -With the -.Fl n -option, wait instead for any one of the given -.Ar job Ns s, -or if none are given, any job, to complete, and -return the exit status of that job. -If none of the given -.Ar job -arguments is a current child of the shell, -or if no -.Ar job -arguments are given and the shell has no unwaited for children, -then the exit status will be 127. -.Pp -The -.Fl p Ar var -option allows the process (or job) identifier of the -job for which the exit status is returned to be obtained. -The variable named (which must not be readonly) will be -unset initially, then if a job has exited and its status is -being returned, set to the identifier from the -arg list (if given) of that job, -or the lead process identifier of the job to exit when used with -.Fl n -and no job arguments. -Note that -.Fl p -with neither -.Fl n -nor -.Ar job -arguments is useless, as in that case no job status is -returned, the variable named is simply unset. -.Pp -If the wait is interrupted by a signal, -its exit status will be greater than 128, -and -.Ar var , -if given, will remain unset. -.Pp -Once waited upon, by specific process number or job-id, -or by a -.Ic wait -with no arguments, -knowledge of the child is removed from the system, -and it cannot be waited upon again. -.Pp -Note than when a list of jobs are given, more that -one argument might refer to the same job. -In that case, if the final argument represents a job -that is also given earlier in the list, it is not -defined whether the status returned will be the -exit status of the job, or 127 indicating that -the child no longer existed when the wait command -reached the later argument in the list. -In this -.Nm -the exit status will be that from the job. -.Nm -waits for each job exactly once, regardless of -how many times (or how many different ways) it -is listed in the arguments to -.Ic wait . -That is -.Bd -literal -offset indent -compact -wait 100 100 100 -.Ed -is identical to -.Bd -literal -offset indent -compact -wait 100 -.Ed -.El -.\" -.\" -.Ss Job Control -.\" -Each process (or set of processes) started by -.Nm -is created as a -.Dq job -and added to the jobs table. -When enabled by the -.Fl m -option -.Pq aka Fl o Cm monitor -when the job is created, -.Nm -places each job (if run from the top level shell) -into a process group of its own, which allows control -of the process(es), and its/their descendants, as a unit. -When the -.Fl m -option is off, or when started from a sub-shell environment, -jobs share the same process group as the parent shell. -The -.Fl m -option is enabled by default in interactive shells with -a terminal as standard input and standard error. -.Pp -Jobs with separate process groups may be stopped, and then later -resumed in the foreground (with access to the terminal) -or in the background (where attempting to read from the -terminal will result in the job stopping.) -A list of current jobs can be obtained using the -.Ic jobs -built-in command. -Jobs are identified using either the process identifier -of the lead process of the job (the value available in -the special parameter -.Dq Dv \&! -if the job is started in the background), or using percent -notation. -Each job is given a -.Dq job number -which is a small integer, starting from 1, and can be -referenced as -.Dq Li \&% Ns Ar n -where -.Ar n -is that number. -Note that this applies to jobs both with and without their own process groups. -Job numbers are shown in the output from the -.Ic jobs -command enclosed in brackets -.Po -.Sq Li \&[ -and -.Sq Li \&] -.Pc . -Whenever the job table becomes empty, the numbers begin at one again. -In addition, there is the concept of a current, and a previous job, -identified by -.Dq Li \&%+ -.Po -or -.Dq Li \&%% -or even just -.Dq Li \&% -.Pc , -and a previous job, identified by -.Dq Li \&%\- . -Whenever a background job is started, -or a job is resumed in the background, -it becomes the current job. -The job that was the current job -(prepare for a big surprise here, drum roll..., wait for it...\&) -becomes the previous job. -When the current job terminates, the previous job is -promoted to be the current job. -In addition the form -.Dq Li \&% Ns Ar string\^ -finds the job for which the command starts with -.Ar string -and the form -.Dq Li \&%? Ns Ar string\^ -finds the job which contains the -.Ar string -in its command somewhere. -Both forms require the result to be unambiguous. -For this purpose the -.Dq command -is that shown in the output from the -.Ic jobs -command, not the original command line. -.Pp -The -.Ic bg , -.Ic fg , -.Ic jobid , -.Ic jobs , -.Ic kill , -and -.Ic wait -commands all accept job identifiers as arguments, in addition to -process identifiers (larger integers). -See the -.Sx Built-ins -section above, and -.Xr kill 1 , -for more details of those commands. -In addition, a job identifier -(using one of the -.Dq \&% forms ) -issued as a command, without arguments, is interpreted as -if it had been given as the argument to the -.Ic fg -command. -.Pp -To cause a foreground process to stop, enter the terminal's -.Ic stop -character (usually control-Z). -To cause a background process to stop, send it a -.Dv STOP -signal, using the kill command. -A useful function to define is -.Bd -literal -offset indent -stop() { kill -s STOP "${@:-%%}"; } -.Ed -.Pp -The -.Ic fg -command resumes a stopped job, placing it in the foreground, -and -.Ic bg -resumes a stopped job in the background. -The -.Ic jobid -command provides information about process identifiers, job identifiers, -and the process group identifier, for a job. -.Pp -Whenever a sub-shell is created, the jobs table becomes invalid -(the sub-shell has no children.) -However, to enable uses like -.Bd -literal -offset indent -PID=$(jobid -p %1) -.Ed -.Pp -the table is only actually cleared in a sub-shell when needed to -create the first job there (built-in commands run in the foreground -do not create jobs.) -Note that in this environment, there is no useful current job -.Dq ( Li \&%% -actually refers to the sub-shell itself, but is not accessible) -but the job which is the current job in the parent can be accessed as -.Dq Li \&%\- . -.\" -.\" -.Ss Command Line Editing -.\" -When -.Nm -is being used interactively from a terminal, the current command -and the command history (see -.Ic fc -in the -.Sx Built-ins -section) -can be edited using emacs-mode or vi-mode command-line editing. -The command -.Ql set -o emacs -(or -.Fl E -option) -enables emacs-mode editing. -The command -.Ql set -o vi -(or -.Fl V -option) -enables vi-mode editing and places the current shell process into -vi insert mode. -(See the -.Sx Argument List Processing -section above.) -.Pp -The vi-mode uses commands similar to a subset of those described in the -.Xr vi 1 -man page. -With vi-mode -enabled, -.Nm sh -can be switched between insert mode and command mode. -It's similar to -.Ic vi : -pressing the -.Aq ESC -key will throw you into vi command mode. -Pressing the -.Aq return -key while in command mode will pass the line to the shell. -.Pp -The emacs-mode uses commands similar to a subset available in the -.Ic emacs -editor. -With emacs-mode enabled, special keys can be used to modify the text -in the buffer using the control key. -.Pp -.Nm -uses the -.Xr editline 3 -library. -See -.Xr editline 7 -for a list of the possible command bindings, -and the default settings in emacs and vi modes. -Also see -.Xr editrc 5 -for the commands that can be given to configure -.Xr editline 7 -in the file named by the -.Ev EDITRC -parameter, -or a file used with the -.Ic inputrc -built-in command, -or using -.Xr editline 7 Ap s -configuration command line. -.Pp -When command line editing is enabled, the -.Xr editline 7 -functions control printing of the -.Ev PS1 -and -.Ev PS2 -prompts when required. -As, in this mode, the command line editor needs to -keep track of what characters are in what position on -the command line, care needs to be taken when setting -the prompts. -Normal printing characters are handled automatically, -however mode setting sequences, which do not actually display -on the terminal, need to be identified to -.Xr editline 7 . -This is done, when needed, by choosing a character that -is not needed anywhere in the prompt, including in the mode -setting sequences, any single character is acceptable, -and assigning it to the shell parameter -.Dv PSlit . -Then that character should be used, in pairs, in the -prompt string. -Between each pair of -.Dv PSlit -characters are mode setting sequences, which affect the printing -attributes of the following (normal) characters of the prompt, -but do not themselves appear visibly, nor change the terminal's -cursor position. -.Pp -Each such sequence, that is -.Dv PSlit -character, mode setting character sequence, and another -.Dv PSlit -character, must currently be followed by at least one following -normal prompt character, or it will be ignored. -That is, a -.Dv PSlit -character cannot be the final character of -.Ev PS1 -or -.Ev PS2 , -nor may two -.Dv PSlit -delimited sequences appear adjacent to each other. -Each sequence can contain as many mode altering sequences as are -required however. -Only the first character from -.Dv PSlit -will be used. -When set -.Dv PSlit -should usually be set to a string containing just one -character, then it can simply be embedded in -.Ev PS1 -(or -.Ev PS2 ) -as in -.Pp -.D1 Li PS1=\*q${PSlit} Ns Ar mset\^ Ns Li ${PSlit}XYZ${PSlit} Ns Ar mclr\^ Ns Li ${PSlit}ABC\*q -.Pp -The prompt visible will be -.Dq XYZABC -with the -.Dq XYZ -part shown according as defined by the mode setting characters -.Ar mset , -and then cleared again by -.Ar mclr . -See -.Xr tput 1 -for one method to generate appropriate mode sequences. -Note that both parts, XYZ and ABC, must each contain at least one -character. -.Pp -If -.Dv PSlit -is unset, which is its initial state, or set to a null string, -no literal character will be defined, -and all characters of the prompt strings will be assumed -to be visible characters (which includes spaces etc.) -To allow smooth use of prompts, without needing redefinition, when -.Xr editline 7 -is disabled, the character chosen should be one which will be -ignored by the terminal if received, as when -.Xr editline 7 -is not in use, the prompt strings are simply written to the terminal. -For example, setting: -.\" XXX: PS1 line is too long for -offset indent -.Bd -literal -offset left - PSlit="$(printf\ '\e1')" - PS1="${PSlit}$(tput\ bold\ blink)${PSlit}\e$${PSlit}$(tput\ sgr0)${PSlit}\ " -.Ed -.Pp -will arrange for the primary prompt to be a bold blinking dollar sign, -if supported by the current terminal, followed by an (ordinary) space, -and, as the SOH (control-A) character -.Pq Sq \e1 -will not normally affect -a terminal, this same prompt will usually work with -.Xr editline 7 -enabled or disabled. -.Sh ENVIRONMENT -.Bl -tag -width MAILCHECK -.It Ev CDPATH -The search path used with the -.Ic cd -built-in. -.It Ev EDITRC -Gives the name of the file containing commands for -.Xr editline 7 . -See -.Xr editrc 5 -for possible content and format. -The file is processed, when in interactive mode with -command line editing enabled, whenever -.Ev EDITRC -is set (even with no actual value change,) -and if command line editing changes from disabled to enabled, -or the editor style used is changed. -(See the -.Fl E -and -.Fl V -options of the -.Ic set -built-in command, described in -.Sx Built-ins -above, which are documented further above in -.Sx Argument List Processing . ) -If unset -.Dq $HOME/.editrc -is used. -.It Ev ENV -Names the file sourced at startup by the shell. -Unused by this shell after initialization, -but is usually passed through the environment to -descendant shells. -.It Ev EUSER -Set to the login name of the effective user id running the shell, -as returned by -.Bd -compact -literal -offset indent -getpwuid(geteuid())->pw_name -.Ed -.Po -See -.Xr getpwuid 3 -and -.Xr geteuid 2 -for more details. -.Pc -This is obtained each time -.Ev EUSER -is expanded, so changes to the shell's execution identity -cause updates without further action. -If unset, it returns nothing. -If set it loses its special properties, and is simply a variable. -.It Ev HISTSIZE -The number of lines in the history buffer for the shell. -.It Ev HOME -Set automatically by -.Xr login 1 -from the user's login directory in the password file -.Pq Xr passwd 5 . -This environment variable also functions as the default argument for the -.Ic cd -built-in. -.It Ev HOSTNAME -Set to the current hostname of the system, as returned by -.Xr gethostname 3 . -This is obtained each time -.Ev HOSTNAME -is expanded, so changes to the system's name are reflected -without further action. -If unset, it returns nothing. -If set it loses its special properties, and is simply a variable. -.It Ev IFS -Input Field Separators. -This is normally set to -.Aq space , -.Aq tab , -and -.Aq newline . -See the -.Sx White Space Splitting -section for more details. -.It Ev LANG -The string used to specify localization information that allows users -to work with different culture-specific and language conventions. -See -.Xr nls 7 . -.It Dv LINENO -The current line number in the script or function. -See the section -.Sx LINENO -below for more details. -.It Ev MAIL -The name of a mail file, that will be checked for the arrival of new mail. -Overridden by -.Ev MAILPATH . -The check occurs just before -.Ev PS1 -is written, immediately after reporting jobs which have changed status, -in interactive shells only. -New mail is considered to have arrived if the monitored file -has increased in size since the last check. -.\" .It Ev MAILCHECK -.\" The frequency in seconds that the shell checks for the arrival of mail -.\" in the files specified by the -.\" .Ev MAILPATH -.\" or the -.\" .Ev MAIL -.\" file. -.\" If set to 0, the check will occur at each prompt. -.It Ev MAILPATH -A colon -.Dq \&: -separated list of file names, for the shell to check for incoming mail. -This environment setting overrides the -.Ev MAIL -setting. -There is a maximum of 10 mailboxes that can be monitored at once. -.It Ev PATH -The default search path for executables. -See the -.Sx Path Search -section above. -.It Ev POSIXLY_CORRECT -If set in the environment upon initialization of the shell, -then the shell option -.Ic posix -will be set. -.Po -See the description of the -.Ic set -command in the -.Sx Built-ins -section. -.Pc -After initialization it is unused by the shell, -but is usually passed through the environment to -descendant processes, including other instances of the shell, -which may interpret it in a similar way. -.It Ev PPID -The process identified of the parent process of the -current shell. -This value is set at shell startup, ignoring -any value in the environment, and then made readonly. -.It Ev PS1 -The primary prompt string, which defaults to -.Dq Li "$ " , -unless you are the superuser, in which case it defaults to -.Dq Li "# " . -This string is subject to parameter, arithmetic, and if -enabled by setting the -.Ic promptcmds -option, command substitution before being output. -During execution of commands used by command substitution, -execution tracing, the -.Ic xtrace -.Ic ( set Fl x ) -option is temporarily disabled. -If -.Ic promptcmds -is not set and the prompt string uses command substitution, -the prompt used will be an appropriate error string. -For other expansion errors, a message will be output, -and the unexpanded string will then be used as the prompt. -.It Ev PS2 -The secondary prompt string, which defaults to -.Dq Li "> " . -After expansion (as for -.Ev PS1 ) -it is written whenever more input is required to complete the -current command. -.It Ev PS4 -Output, after expansion like -.Ev PS1 , -before each line when execution trace -.Ic ( set Fl x ) -is enabled. -.Ev PS4 -defaults to -.Dq Li "+ " . -.It Ev PSc -Initialized by the shell, ignoring any value from the environment, -to a single character string, either -.Sq \&# -or -.Sq \&$ , -depending upon whether the current user is the superuser or not. -This is intended for use when building a custom -.Ev PS1 . -.It Ev PSlit -Defines the character which may be embedded in pairs, in -.Ev PS1 -or -.Ev PS2 -to indicate to -.Xr editline 7 -that the characters between each pair of occurrences of the -.Dv PSlit -character will not appear in the visible prompt, and will not -cause the terminal's cursor to change position, but rather set terminal -attributes for the following prompt character(s) at least one of -which must be present. -See -.Sx Command Line Editing -above for more information. -.It Ev RANDOM -Returns a different pseudo-random integer, -in the range [0,32767] each time it is accessed. -.Ev RANDOM -can be assigned an integer value to seed the PRNG. -If the value assigned is a constant, then the -sequence of values produces on subsequent references of -.Ev RANDOM -will repeat after the next time the same constant is assigned. -Note, this is not guaranteed to remain constant from one version -of the shell to another \(en the PRNG algorithm, or seeding -method is subject to change. -If -.Ev RANDOM -is assigned an empty value (null string) then the next time -.Ev RANDOM -is accessed, it will be seeded from a more genuinely random source. -The sequence of pseudo-random numbers generated will not be able to -be generated again (except by luck, whether good or bad, depends!) -This is also how the initial seed is generated, if none has been -assigned before -.Ev RANDOM -is first accessed after shell initialization. -Should the error message -.Dq "RANDOM initialisation failed" -appear on standard error, it indicates that the source -of good random numbers was not available, and -.Ev RANDOM -has instead been seeded with a more predictable value. -The following sequence of random numbers will -not be as unpredictable as they otherwise would be. -.It Ev SECONDS -Returns the number of seconds since the current shell was started. -If unset, it remains unset, and returns nothing, unless set again. -If set, it loses its special properties, and becomes a normal variable. -.It Ev START_TIME -Initialized by the shell to the number of seconds since the Epoch -(see -.Xr localtime 3 ) -when the shell was started. -The value of -.Dl $(( Ns Ev START_TIME + Ev SECONDS Ns )) -represents the current time, if -.Ev START_TIME -has not been modified, and -.Ev SECONDS -has not been set or unset. -.It Ev TERM -The default terminal setting for the shell. -This is inherited by -children of the shell, and is used in the history editing modes. -.\" This is explicitly last, not in sort order - please leave! -.It Ev ToD -When referenced, uses the value of -.Ev ToD_FORMAT -(or -.Dq \&%T -if -.Ev ToD_FORMAT -is unset) as the format argument to -.Xr strftime 3 -to encode the current time of day, in the time zone -defined by -.Ev TZ -if set, or current local time if not, and returns the result. -If unset -.Ev ToD -returns nothing. -If set, it loses its special properties, and becomes a normal variable. -.It Ev ToD_FORMAT -Can be set to the -.Xr strftime 3 -format string to be used when expanding -.Ev ToD . -Initially unset. -.It Ev TZ -If set, gives the time zone -(see -.Xr localtime 3 , -.Xr environ 7 ) -to use when formatting -.Ev ToD -and if exported, other utilities that deal with times. -If unset, the system's local wall clock time zone is used. -.It Ev NETBSD_SHELL -Unlike the variables previously mentioned, -this variable is somewhat strange, -in that it cannot be set, -inherited from the environment, -modified, or exported from the shell. -If set, by the shell, it indicates that the shell is the -.Ic sh -defined by this manual page, and gives its version information. -It can also give information in additional space separated words, -after the version string. -If the shell was built as part of a reproducible build, -the relevant date that was used for that build will be included. -Finally, any non-standard compilation options, -which may affect features available, -that were used when building the shell will be listed. -.Ev NETBSD_SHELL -behaves like any other variable that has the read-only -and un-exportable attributes set. -.El -.Ss Dv LINENO -.Dv LINENO -is in many respects a normal shell variable, containing an -integer value. and can be expanded using any of the forms -mentioned above which can be used for any other variable. -.Pp -.Dv LINENO -can be exported, made readonly, or unset, as with any other -variable, with similar effects. -Note that while being readonly prevents later attempts to -set, or unset, -.Dv LINENO , -it does not prevent its value changing. -References to -.Dv LINENO -.Pq "when not unset" -always obtain the current line number. -However, -.Dv LINENO -should normally not ever be set or unset. -In this shell setting -.Dv LINENO -reverses the effect of an earlier -.Ic unset , -but does not otherwise affect the value obtained. -If unset, -.Dv LINENO -should not normally be set again, doing so is not portable. -If -.Dv LINENO -is set or unset, different shells act differently. -The value of -.Dv LINENO -is never imported from the environment when the shell is -started, though if present there, as with any other variable, -.Dv LINENO -will be exported by this shell. -.Pp -.Dv LINENO -is set automatically by the shell to be the number of the source -line on which it occurs. -When exported, -.Dv LINENO -is exported with its value set to the line number it would have -had had it been referenced on the command line of the command to -which it is exported. -Line numbers are counted from 1, which is the first line the shell -reads from any particular file. -For this shell, standard input, including in an interactive shell, -the user's terminal, is just another file and lines are counted -there as well. -However note that not all shells count interactive -lines this way, it is not wise to rely upon -.Dv LINENO -having a useful value, except in a script, or a function. -.Pp -The role of -.Dv LINENO -in functions is less clear. -In some shells, -.Dv LINENO -continues to refer to the line number in the script which defines -the function, -in others lines count from one within the function, always (and -resume counting normally once the function definition is complete) -and others count in functions from one if the function is defined -interactively, but otherwise just reference the line number in the -script in which the function is defined. -This shell gives the user the option to choose. -If the -.Fl L -flag (the -.Ic local_lineno -option, see -.Sx Argument List Processing ) -is set, when the function is defined, then the function -defaults to counting lines with one being the first line of the -function. -When the -.Fl L -flag is not set, the shell counts lines in a function definition -in the same continuous sequence as the lines that surround the -function definition. -Further, if -.Dv LINENO -is made local -(see -.Sx Built-ins -above) -inside the function, the function can decide which -behavior it prefers. -If -.Dv LINENO -is made local and inherited, and not given a value, as in -.Dl local Fl I Dv LINENO -then from that point in the function, -.Dv LINENO -will give the line number as if lines are counted in sequence -with the lines that surround the function definition (and -any other function definitions in which this is nested.) -If -.Dv LINENO -is made local, and in that same command, given a value, as -.Dl local Oo Fl I Ns | Ns Fl N Oc Dv LINENO Ns = Ns Ar value -then -.Dv LINENO -will give the line number as if lines are counted from one -from the beginning of the function. -The value nominally assigned in this case is irrelevant, and ignored. -For completeness, if lineno is made local and unset, as in -.Dl local Fl N Dv LINENO -then -.Dv LINENO -is simply unset inside the function, and gives no value at all. -.Pp -Now for some technical details. -The line on which -.Dv LINENO -occurs in a parameter expansion, is the line that contains the -.Sq \&$ -that begins the expansion of -.Dv LINENO . -In the case of nested expansions, that -.Sq \&$ -is the one that actually has -.Dv LINENO -as its parameter. -In an arithmetic expansion, where no -.Sq \&$ -is used to evaluate -.Dv LINENO -but -.Dv LINENO -is simply referenced as a variable, then the value is the -line number of the line that contains the -.Sq L -of -.Dv LINENO . -For functions line one of the function definition (when relevant) -is the line that contains the first character of the -function name in the definition. -When exported, the line number of the command is the line number -where the first character of the word which becomes the command name occurs. -.Pp -When the shell opens a new file, for any reason, -it counts lines from one in that file, -and then resumes its original counting once it resumes reading the -previous input stream. -When handling a string passed to -.Ic eval -the line number starts at the line on which the string starts, -and then if the string contains internal newline characters, -those characters increase the line number. -This means that references to -.Dv LINENO -in such a case can produce values larger than would be -produced by a reference on the line after the -.Ic eval . -.Sh FILES -.Bl -item -.It -.Pa $HOME/.profile -.It -.Pa /etc/profile -.El -.Sh EXIT STATUS -Errors that are detected by the shell, such as a syntax error, will cause the -shell to exit with a non-zero exit status. -If the shell is not an -interactive shell, the execution of the shell file will be aborted. -Otherwise -the shell will return the exit status of the last command executed, or -if the exit built-in is used with a numeric argument, it will return the -argument. -.Sh SEE ALSO -.Xr csh 1 , -.Xr echo 1 , -.Xr getopt 1 , -.Xr ksh 1 , -.Xr login 1 , -.Xr printf 1 , -.Xr test 1 , -.Xr editline 3 , -.Xr getopt 3 , -.\" .Xr profile 4 , -.Xr editrc 5 , -.Xr passwd 5 , -.Xr editline 7 , -.Xr environ 7 , -.Xr nls 7 , -.Xr sysctl 8 -.Sh HISTORY -A -.Nm -command appeared in -.At v1 . -It was replaced in -.At v7 -with a version that introduced the basis of the current syntax. -That was, however, unmaintainable so we wrote this one. -.Sh BUGS -Setuid shell scripts should be avoided at all costs, as they are a -significant security risk. -.Pp -The characters generated by filename completion should probably be quoted -to ensure that the filename is still valid after the input line has been -processed. -.Pp -Job control of compound statements (loops, etc) is a complete mess. -.Pp -Many, many, more. -(But less than there were...) -- cgit v1.2.3-70-g09d2