| .\"	$NetBSD: sh.1,v 1.78 2004/06/03 19:54:37 hubertf 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 April 17, 2004 | 
 | .Os | 
 | .Dt SH 1 | 
 | .Sh NAME | 
 | .Nm sh | 
 | .Nd command interpreter (shell) | 
 | .Sh SYNOPSIS | 
 | .Nm | 
 | .Bk -words | 
 | .Op Fl aCefnuvxIimqVEb | 
 | .Op Cm +aCefnuvxIimqVEb | 
 | .Ek | 
 | .Bk -words | 
 | .Op Fl o Ar option_name | 
 | .Op Cm +o Ar option_name | 
 | .Ek | 
 | .Bk -words | 
 | .Op Ar command_file Oo Ar argument ... Oc | 
 | .Ek | 
 | .Nm | 
 | .Fl c | 
 | .Bk -words | 
 | .Op Fl aCefnuvxIimqVEb | 
 | .Op Cm +aCefnuvxIimqVEb | 
 | .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 Oo Ar argument ... Oc | 
 | .Ek | 
 | .Nm | 
 | .Fl s | 
 | .Bk -words | 
 | .Op Fl aCefnuvxIimqVEb | 
 | .Op Cm +aCefnuvxIimqVEb | 
 | .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 with the | 
 | .Tn 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 ) . | 
 | Only features designated by | 
 | .Tn POSIX , | 
 | plus a few Berkeley extensions, are being incorporated into this shell. | 
 | .\" We expect | 
 | .\" .Tn POSIX | 
 | .\" conformance by the time 4.4 BSD is released. | 
 | 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. | 
 | It is the program that is running when a user logs into the system | 
 | (although a user can select a different shell 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 args are present and if the standard input of the shell | 
 | is connected to a terminal (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 | 
 | 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, the shell next reads | 
 | commands from the file named in | 
 | .Ev ENV . | 
 | 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 is 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 case | 
 | and | 
 | .Dq esac | 
 | below (these commands are described later): | 
 | .Pp | 
 | .Bl -item -compact -offset indent | 
 | .It | 
 | .Li case $- in *i*) | 
 | .Bl -item -compact -offset indent | 
 | .It | 
 | .Li # commands for interactive use only | 
 | .It | 
 | .Li ... | 
 | .El | 
 | .It | 
 | .Li esac | 
 | .El | 
 | .Pp | 
 | If command line arguments besides the options have been specified, then | 
 | the shell treats the first argument as the name of a file from which to | 
 | read commands (a shell script), and the remaining arguments are set as the | 
 | positional parameters of the shell ($1, $2, etc). | 
 | Otherwise, the shell | 
 | reads commands from its standard input. | 
 | .Ss Argument List Processing | 
 | All of the single letter options have a corresponding name that can be | 
 | used as an argument to the | 
 | .Fl o | 
 | option. | 
 | The set | 
 | .Fl o | 
 | name is provided next to the single letter option in | 
 | the description below. | 
 | Specifying a dash | 
 | .Dq - | 
 | turns the option on, while using a plus | 
 | .Dq + | 
 | disables the option. | 
 | The following options can be set from the command line or | 
 | with the | 
 | .Ic set | 
 | builtin (described later). | 
 | .Bl -tag -width aaaallexportfoo -offset indent | 
 | .It Fl a Em allexport | 
 | Export all variables assigned to. | 
 | .It Fl c | 
 | Read commands from the | 
 | .Ar command_string | 
 | operand instead of from the standard input. | 
 | Special parameter 0 will be set from the | 
 | .Ar command_name | 
 | operand and the positional parameters ($1, $2, etc.) | 
 | set from the remaining argument operands. | 
 | .It Fl C Em noclobber | 
 | Don't overwrite existing files with | 
 | .Dq \*[Gt] . | 
 | .It Fl e Em errexit | 
 | If not interactive, exit immediately if any untested command fails. | 
 | 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 \*[Am]\*[Am] | 
 | or | 
 | .Dq || | 
 | operator. | 
 | .It Fl f Em noglob | 
 | Disable pathname expansion. | 
 | .It Fl n Em noexec | 
 | If not interactive, read commands but do not execute them. | 
 | This is useful for checking the syntax of shell scripts. | 
 | .It Fl u Em nounset | 
 | Write a message to standard error when attempting to expand a variable | 
 | that is not set, and if the shell is not interactive, exit immediately. | 
 | .It Fl v Em verbose | 
 | The shell writes its input to standard error as it is read. | 
 | Useful for debugging. | 
 | .It Fl x Em xtrace | 
 | Write each command to standard error (preceded by a | 
 | .Sq +\  ) | 
 | before it is executed. | 
 | Useful for debugging. | 
 | .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 I Em ignoreeof | 
 | Ignore EOF's from input when interactive. | 
 | .It Fl i Em interactive | 
 | Force the shell to behave interactively. | 
 | .It Fl m Em monitor | 
 | Turn on job control (set automatically when interactive). | 
 | .It Fl s Em stdin | 
 | Read commands from standard input (set automatically if no file arguments | 
 | are present). | 
 | This option has no effect when set after the shell has | 
 | already started running (i.e. with | 
 | .Ic set ) . | 
 | .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 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 b Em notify | 
 | Enable asynchronous notification of background job completion. | 
 | (UNIMPLEMENTED for 4.4alpha) | 
 | .It "\ \ " Em cdprint | 
 | Make an interactive shell always print the new directory name when | 
 | changed by the | 
 | .Ic cd | 
 | command. | 
 | .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). | 
 | Following is a list of operators: | 
 | .Bl -ohang -offset indent | 
 | .It "Control operators:" | 
 | .Dl \*[Am]  \*[Am]\*[Am]  \&(  \&)  \&;  ;; | || \*[Lt]newline\*[Gt] | 
 | .It "Redirection operators:" | 
 | .Dl \*[Lt]  \*[Gt]  \*[Gt]|  \*[Lt]\*[Lt]  \*[Gt]\*[Gt]  \*[Lt]\*[Am]  \*[Gt]\*[Am]  \*[Lt]\*[Lt]-  \*[Lt]\*[Gt] | 
 | .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 three types of quoting: matched single quotes, | 
 | matched double quotes, and backslash. | 
 | .Ss Backslash | 
 | A backslash preserves the literal meaning of the following | 
 | character, with the exception of | 
 | .Aq newline . | 
 | A backslash preceding a | 
 | .Aq newline | 
 | is treated as a line continuation. | 
 | .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 dollarsign | 
 | .Pq $ , | 
 | backquote | 
 | .Pq ` , | 
 | and backslash | 
 | .Pq \e . | 
 | The backslash inside double quotes is historically weird, and serves to | 
 | quote only the following characters: | 
 | .Dl $  `  \*q  \e  \*[Lt]newline\*[Gt] . | 
 | Otherwise it remains literal. | 
 | .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 while -offset indent | 
 | .It ! Ta elif Ta fi Ta while Ta case | 
 | .It else Ta for Ta then Ta { Ta } | 
 | .It do Ta done Ta until Ta if Ta esac | 
 | .El | 
 | .Pp | 
 | Their meaning is discussed later. | 
 | .Ss Aliases | 
 | An alias is a name and corresponding value set using the | 
 | .Ic alias | 
 | builtin command. | 
 | Whenever a reserved word may occur (see above), | 
 | 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 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 | 
 | .Tn 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 name=value | 
 | are stripped off and assigned to the environment of the simple command. | 
 | Redirection operators and their arguments (as described below) are | 
 | stripped off and saved for processing. | 
 | .It | 
 | The remaining words are expanded as described in | 
 | the section called | 
 | .Dq Expansions , | 
 | and the first remaining word is considered the command name and the | 
 | command is located. | 
 | The remaining words are considered the arguments of the command. | 
 | If no command name resulted, then the | 
 | .Dq name=value | 
 | variable assignments recognized in item 1 affect the current shell. | 
 | .It | 
 | Redirections are performed 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 [n] Va redir-op Ar file | 
 | .Pp | 
 | where | 
 | .Va redir-op | 
 | is one of the redirection operators mentioned previously. | 
 | Following is a list of the possible redirections. | 
 | The | 
 | .Bq n | 
 | is an optional number, as in | 
 | .Sq 3 | 
 | (not | 
 | .Sq Bq 3 ) , | 
 | that refers to a file descriptor. | 
 | .Bl -tag -width aaabsfiles -offset indent | 
 | .It [n] Ns \*[Gt] file | 
 | Redirect standard output (or n) to file. | 
 | .It [n] Ns \*[Gt]| file | 
 | Same, but override the | 
 | .Fl C | 
 | option. | 
 | .It [n] Ns \*[Gt]\*[Gt] file | 
 | Append standard output (or n) to file. | 
 | .It [n] Ns \*[Lt] file | 
 | Redirect standard input (or n) from file. | 
 | .It [n1] Ns \*[Lt]\*[Am] Ns n2 | 
 | Duplicate standard input (or n1) from file descriptor n2. | 
 | .It [n] Ns \*[Lt]\*[Am]- | 
 | Close standard input (or n). | 
 | .It [n1] Ns \*[Gt]\*[Am] Ns n2 | 
 | Duplicate standard output (or n1) to n2. | 
 | .It [n] Ns \*[Gt]\*[Am]- | 
 | Close standard output (or n). | 
 | .It [n] Ns \*[Lt]\*[Gt] file | 
 | Open file for reading and writing on standard input (or n). | 
 | .El | 
 | .Pp | 
 | The following redirection is often called a | 
 | .Dq here-document . | 
 | .Bl -item -offset indent | 
 | .It | 
 | .Li [n]\*[Lt]\*[Lt] delimiter | 
 | .Dl here-doc-text ... | 
 | .Li delimiter | 
 | .El | 
 | .Pp | 
 | All the text on successive lines up to the delimiter 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 | 
 | subjected to parameter expansion, command substitution, and arithmetic | 
 | expansion (as described in the section on | 
 | .Dq Expansions ) . | 
 | If the operator is | 
 | .Dq \*[Lt]\*[Lt]- | 
 | instead of | 
 | .Dq \*[Lt]\*[Lt] , | 
 | then leading tabs in the here-doc-text are stripped. | 
 | .Ss Search and Execution | 
 | There are three types of commands: shell functions, builtin commands, and | 
 | normal programs -- and the command is searched for (by name) in that order. | 
 | They each are executed in a different way. | 
 | .Pp | 
 | When a shell function is executed, all of the shell positional parameters | 
 | (except $0, which 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. | 
 | Then the command given in the function definition is executed. | 
 | The positional parameters are restored to their original values | 
 | when the command completes. | 
 | This all occurs within the current shell. | 
 | .Pp | 
 | Shell builtins are executed internally to the shell, without spawning a | 
 | new process. | 
 | .Pp | 
 | Otherwise, if the command name doesn't match a function or builtin, 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 (i.e., if it does | 
 | not begin with the "magic number" whose | 
 | .Tn ASCII | 
 | representation is "#!", so | 
 | .Xr execve 2 | 
 | returns | 
 | .Er ENOEXEC | 
 | then) the shell will interpret the program in a subshell. | 
 | 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 "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 builtin command by that name. | 
 | If a builtin 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 | 
 | 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. | 
 | .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 for normal or 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 builtin 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. | 
 | .Ss Complex Commands | 
 | Complex commands are combinations of simple commands with control | 
 | operators or reserved words, together creating a larger complex command. | 
 | More generally, a command is one of the following: | 
 | .Bl -bullet | 
 | .It | 
 | simple command | 
 | .It | 
 | pipeline | 
 | .It | 
 | list or compound-list | 
 | .It | 
 | compound command | 
 | .It | 
 | function definition | 
 | .El | 
 | .Pp | 
 | Unless otherwise stated, the exit status of a command is that of the last | 
 | simple command executed by the command. | 
 | .Ss Pipelines | 
 | A pipeline is a sequence of one or more commands separated | 
 | by the control operator |. | 
 | The standard output of all but | 
 | the last command is connected to the standard input | 
 | of the next command. | 
 | The standard output of the last | 
 | command is inherited from the shell, as usual. | 
 | .Pp | 
 | The format for a pipeline is: | 
 | .Pp | 
 | .Dl [!] command1 [ | command2 ...] | 
 | .Pp | 
 | The standard output of command1 is connected to the standard input of | 
 | command2. | 
 | The standard input, standard output, or both of a command is | 
 | considered to be assigned by the pipeline before any redirection specified | 
 | by redirection operators that are part of the command. | 
 | .Pp | 
 | If the pipeline is not in the background (discussed later), the shell | 
 | waits for all commands to complete. | 
 | .Pp | 
 | If the reserved word ! does not precede the pipeline, the exit status is | 
 | the exit status of the last command specified in the pipeline. | 
 | Otherwise, the exit status is the logical NOT of the exit status of the | 
 | last command. | 
 | That is, if the last command returns zero, the exit status | 
 | is 1; if the last command returns greater than zero, the exit status is | 
 | zero. | 
 | .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\*[Gt]\*[Am]1 | command2 | 
 | .Pp | 
 | sends both the standard output and standard error of command1 | 
 | to the standard input of command2. | 
 | .Pp | 
 | A ; or | 
 | .Aq newline | 
 | terminator causes the preceding AND-OR-list (described | 
 | next) to be executed sequentially; a \*[Am] causes asynchronous execution of | 
 | the preceding AND-OR-list. | 
 | .Pp | 
 | Note that unlike some other shells, each process in the pipeline is a | 
 | child of the invoking shell (unless it is a shell builtin, in which case | 
 | it executes in the current shell -- but any effect it has on the | 
 | environment is wiped). | 
 | .Ss Background Commands -- \*[Am] | 
 | If a command is terminated by the control operator ampersand (\*[Am]), the | 
 | shell executes the command asynchronously -- 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 \*[Am] [command2 \*[Am] ...] | 
 | .Pp | 
 | If the shell is not interactive, the standard input of an asynchronous | 
 | command is set to | 
 | .Pa /dev/null . | 
 | .Ss Lists -- Generally Speaking | 
 | A list is a sequence of zero or more commands separated by newlines, | 
 | semicolons, or ampersands, and optionally terminated by one of these three | 
 | characters. | 
 | 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 proceed onto the next command; otherwise it waits | 
 | for the command to terminate before proceeding to the next one. | 
 | .Ss Short-Circuit List Operators | 
 | .Dq \*[Am]\*[Am] | 
 | and | 
 | .Dq || | 
 | are AND-OR list operators. | 
 | .Dq \*[Am]\*[Am] | 
 | executes the first command, and then executes the second command if and only | 
 | if the exit status of the first command is zero. | 
 | .Dq || | 
 | is similar, but executes the second command if and only if the exit status | 
 | of the first command is nonzero. | 
 | .Dq \*[Am]\*[Am] | 
 | and | 
 | .Dq || | 
 | both have the same priority. | 
 | Note that these operators are left-associative, so | 
 | .Dq true || echo bar && echo baz | 
 | writes | 
 | .Dq baz | 
 | and nothing else. | 
 | This is not the way it works in C. | 
 | .Ss Flow-Control Constructs -- if, while, for, case | 
 | The syntax of the if command is | 
 | .Bd -literal -offset indent | 
 | if list | 
 | then list | 
 | [ elif list | 
 | then    list ] ... | 
 | [ else list ] | 
 | fi | 
 | .Ed | 
 | .Pp | 
 | The syntax of the while command is | 
 | .Bd -literal -offset indent | 
 | while list | 
 | do   list | 
 | done | 
 | .Ed | 
 | .Pp | 
 | The two lists are executed repeatedly while the exit status of the | 
 | first list is zero. | 
 | The until command is similar, but has the word | 
 | until in place of while, which causes it to | 
 | repeat until the exit status of the first list is zero. | 
 | .Pp | 
 | The syntax of the for command is | 
 | .Bd -literal -offset indent | 
 | for variable in word ... | 
 | do   list | 
 | done | 
 | .Ed | 
 | .Pp | 
 | The words are expanded, and then the list is executed repeatedly with the | 
 | variable set to each word in turn. | 
 | do and done may be replaced with | 
 | .Dq { | 
 | and | 
 | .Dq } . | 
 | .Pp | 
 | The syntax of the break and continue command is | 
 | .Bd -literal -offset indent | 
 | break [ num ] | 
 | continue [ num ] | 
 | .Ed | 
 | .Pp | 
 | Break terminates the num innermost for or while loops. | 
 | Continue continues with the next iteration of the innermost loop. | 
 | These are implemented as builtin commands. | 
 | .Pp | 
 | The syntax of the case command is | 
 | .Bd -literal -offset indent | 
 | case word in | 
 | pattern) list ;; | 
 | \&... | 
 | esac | 
 | .Ed | 
 | .Pp | 
 | The pattern can actually be one or more patterns (see | 
 | .Sx Shell Patterns | 
 | described later), separated by | 
 | .Dq \*(Ba | 
 | characters. | 
 | .Ss Grouping Commands Together | 
 | Commands may be grouped by writing either | 
 | .Pp | 
 | .Dl (list) | 
 | .Pp | 
 | or | 
 | .Pp | 
 | .Dl { list; } | 
 | .Pp | 
 | The first of these executes the commands in a subshell. | 
 | Builtin commands grouped into a (list) will not affect the current shell. | 
 | The second form does not fork another shell so is slightly more efficient. | 
 | Grouping commands together this way allows you to redirect | 
 | their output as though they were one program: | 
 | .Pp | 
 | .Bd -literal -offset indent | 
 | { echo -n \*q hello \*q ; echo \*q world" ; } \*[Gt] greeting | 
 | .Ed | 
 | .Pp | 
 | Note that | 
 | .Dq } | 
 | must follow a control operator (here, | 
 | .Dq \&; ) | 
 | 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 name ( ) command | 
 | .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 } . | 
 | .Pp | 
 | Variables may be declared to be local to a function by using a local | 
 | command. | 
 | This should appear as the first statement of a function, and the syntax is | 
 | .Pp | 
 | .Dl local [ variable | - ] ... | 
 | .Pp | 
 | Local is implemented as a builtin command. | 
 | .Pp | 
 | When a variable is made local, it inherits the initial value and exported | 
 | and readonly flags from the variable with the same name in the surrounding | 
 | scope, if there is one. | 
 | Otherwise, the variable is initially unset. | 
 | The shell uses dynamic scoping, so that if you make the variable x local to | 
 | function f, which then calls function g, references to the variable x made | 
 | inside g will refer to the variable x declared inside f, not to the global | 
 | variable named x. | 
 | .Pp | 
 | The only special parameter that can be made local is | 
 | .Dq - . | 
 | Making | 
 | .Dq - | 
 | local any shell options that are changed via the set command inside the | 
 | function to be restored to their original values when the function | 
 | returns. | 
 | .Pp | 
 | The syntax of the return command is | 
 | .Pp | 
 | .Dl return [ exitstatus ] | 
 | .Pp | 
 | It terminates the currently executing function. | 
 | Return is implemented as a builtin command. | 
 | .Ss Variables and Parameters | 
 | The shell maintains a set of parameters. | 
 | A parameter denoted by a name is called a variable. | 
 | When starting up, the shell turns all the environment | 
 | variables into shell variables. | 
 | New variables can be set using the form | 
 | .Pp | 
 | .Dl name=value | 
 | .Pp | 
 | Variables set by the user must have a name consisting solely of | 
 | alphabetics, numerics, and underscores - the first of which must not be | 
 | numeric. | 
 | A parameter can also be denoted by a number or a special | 
 | character as explained below. | 
 | .Ss Positional Parameters | 
 | A positional parameter is a parameter denoted by a number (n \*[Gt] 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 | 
 | builtin can also be used to set or reset them. | 
 | .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 * | 
 | 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 @ | 
 | 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 @ is | 
 | double-quoted. | 
 | What this basically means, for example, is | 
 | if $1 is | 
 | .Dq abc | 
 | and $2 is | 
 | .Dq def ghi , | 
 | then | 
 | .Qq $@ | 
 | expands to | 
 | the two arguments: | 
 | .Pp | 
 | .Sm off | 
 | .Dl \*q abc \*q \  \*q def\ ghi \*q | 
 | .Sm on | 
 | .It # | 
 | Expands to the number of positional parameters. | 
 | .It \&? | 
 | Expands to the exit status of the most recent pipeline. | 
 | .It - (Hyphen.) | 
 | Expands to the current option flags (the single-letter | 
 | option names concatenated into a string) as specified on | 
 | invocation, by the set builtin command, or implicitly | 
 | by the shell. | 
 | .It $ | 
 | Expands to the process ID of the invoked shell. | 
 | A subshell retains the same value of $ as its parent. | 
 | .It \&! | 
 | 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. | 
 | .It 0 (Zero.) | 
 | Expands to the name of the shell or shell script. | 
 | .El | 
 | .Ss Word Expansions | 
 | This clause 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 @ 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. | 
 | All the characters up to | 
 | a slash (/) or the end of the word are treated as a username | 
 | and are replaced with the user's home directory. | 
 | If the username is missing (as in | 
 | .Pa ~/foobar ) , | 
 | the tilde is replaced with the value of the | 
 | .Va HOME | 
 | variable (the current user's home directory). | 
 | .Ss Parameter Expansion | 
 | The format for parameter expansion is as follows: | 
 | .Pp | 
 | .Dl ${expression} | 
 | .Pp | 
 | where expression consists of all characters until the matching | 
 | .Dq } . | 
 | Any | 
 | .Dq } | 
 | 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 | 
 | .Dq } . | 
 | .Pp | 
 | The simplest form for parameter expansion is: | 
 | .Pp | 
 | .Dl ${parameter} | 
 | .Pp | 
 | The value, if any, of parameter is substituted. | 
 | .Pp | 
 | The parameter name or symbol can be enclosed in braces, which are | 
 | optional 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 @. | 
 | .El | 
 | .Pp | 
 | In addition, a parameter expansion can be modified by using one of the | 
 | following formats. | 
 | .Bl -tag -width aaparameterwordaaaaa | 
 | .It ${parameter:-word} | 
 | Use Default Values. | 
 | If parameter is unset or null, the expansion of word | 
 | is substituted; otherwise, the value of parameter is substituted. | 
 | .It ${parameter:=word} | 
 | Assign Default Values. | 
 | If parameter is unset or null, the expansion of | 
 | word is assigned to parameter. | 
 | In all cases, the final value of parameter is substituted. | 
 | Only variables, not positional parameters or special | 
 | parameters, can be assigned in this way. | 
 | .It ${parameter:?[word]} | 
 | Indicate Error if Null or Unset. | 
 | If parameter is unset or null, the | 
 | expansion of word (or a message indicating it is unset if word is omitted) | 
 | is written to standard error and the shell exits with a nonzero exit status. | 
 | Otherwise, the value of parameter is substituted. | 
 | An interactive shell need not exit. | 
 | .It ${parameter:+word} | 
 | Use Alternative Value. | 
 | If parameter is unset or null, null is | 
 | substituted; otherwise, the expansion of word is substituted. | 
 | .El | 
 | .Pp | 
 | In the parameter expansions shown previously, use of the colon in the | 
 | format results in a test for a parameter that is unset or null; omission | 
 | of the colon results in a test for a parameter that is only unset. | 
 | .Bl -tag -width aaparameterwordaaaaa | 
 | .It ${#parameter} | 
 | String Length. | 
 | The length in characters of the value of 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 * or @, 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 ${parameter%word} | 
 | Remove Smallest Suffix Pattern. | 
 | The word is expanded to produce a pattern. | 
 | The parameter expansion then results in parameter, with the | 
 | smallest portion of the suffix matched by the pattern deleted. | 
 | .It ${parameter%%word} | 
 | Remove Largest Suffix Pattern. | 
 | The word is expanded to produce a pattern. | 
 | The parameter expansion then results in parameter, with the largest | 
 | portion of the suffix matched by the pattern deleted. | 
 | .It ${parameter#word} | 
 | Remove Smallest Prefix Pattern. | 
 | The word is expanded to produce a pattern. | 
 | The parameter expansion then results in parameter, with the | 
 | smallest portion of the prefix matched by the pattern deleted. | 
 | .It ${parameter##word} | 
 | Remove Largest Prefix Pattern. | 
 | The word is expanded to produce a pattern. | 
 | The parameter expansion then results in parameter, with the largest | 
 | portion of the prefix matched by the pattern deleted. | 
 | .El | 
 | .Ss Command Substitution | 
 | Command substitution allows the output of a command to be substituted in | 
 | place of the command name itself. | 
 | Command substitution occurs when the command is enclosed as follows: | 
 | .Pp | 
 | .Dl $(command) | 
 | .Pp | 
 | or | 
 | .Po | 
 | .Dq backquoted | 
 | version | 
 | .Pc : | 
 | .Pp | 
 | .Dl `command` | 
 | .Pp | 
 | The shell expands the command substitution by executing command in a | 
 | subshell environment and replacing the command substitution with the | 
 | standard output of the command, removing sequences of one or more | 
 | .Ao newline Ac Ns s | 
 | at 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 translated into | 
 | .Ao space Ac Ns s , | 
 | depending on the value of | 
 | .Ev IFS | 
 | and quoting that is in effect.) | 
 | .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 $((expression)) | 
 | .Pp | 
 | The expression is treated as if it were in double-quotes, except | 
 | that a double-quote inside the expression is not treated specially. | 
 | The shell expands all tokens in the expression for parameter expansion, | 
 | command substitution, and quote removal. | 
 | .Pp | 
 | Next, the shell treats this as an arithmetic expression and | 
 | substitutes the value of the expression. | 
 | .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 for | 
 | field splitting and multiple fields can result. | 
 | .Pp | 
 | The shell treats each character of the | 
 | .Ev IFS | 
 | as a delimiter and use the delimiters to split the results of parameter | 
 | expansion and command substitution into fields. | 
 | .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 back quotes 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 matches any single character. | 
 | A left bracket | 
 | .Pq Dq \&[ | 
 | introduces a character class. | 
 | The end of the character class is indicated by a | 
 | .Pq Dq \&] ; | 
 | if the | 
 | .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 range of characters may be specified using a minus sign. | 
 | The character class may be complemented | 
 | by making an exclamation point 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 minus sign, make it the first or last character listed. | 
 | .Ss Builtins | 
 | This section lists the builtin commands which are builtin because they | 
 | need to perform some operation that can't be performed by a separate | 
 | process. | 
 | In addition to these, there are several other commands that may | 
 | be builtin for efficiency (e.g. | 
 | .Xr printf 1 , | 
 | .Xr echo 1 , | 
 | .Xr test 1 , | 
 | etc). | 
 | .Bl -tag -width 5n | 
 | .It : | 
 | A null command that returns a 0 (true) exit value. | 
 | .It \&. file | 
 | The commands in the specified file are read and executed by the shell. | 
 | .It alias Op Ar name Ns Op Ar "=string ..." | 
 | If | 
 | .Ar name=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 | 
 | builtin prints the | 
 | names and values of all defined aliases (see | 
 | .Ic unalias ) . | 
 | .It bg [ Ar job ] ... | 
 | Continue the specified jobs (or the current job if no | 
 | jobs are given) in the background. | 
 | .It Xo command | 
 | .Op Fl p | 
 | .Op Fl v | 
 | .Op Fl V | 
 | .Ar command | 
 | .Op Ar arg ... | 
 | .Xc | 
 | 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 builtin 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 type builtin. | 
 | .It Fl v | 
 | Do not execute the command but | 
 | search for the command and print the absolute pathname | 
 | of utilities, the name for builtins or the expansion of aliases. | 
 | .El | 
 | .It cd 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 | 
 | .Ar directory | 
 | in the current directory name with | 
 | .Ar replace . | 
 | 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, 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 . | 
 | 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. | 
 | These may be different either because the | 
 | .Ev CDPATH | 
 | mechanism was used or because a symbolic link was crossed. | 
 | .It eval Ar string ... | 
 | Concatenate all the arguments with spaces. | 
 | Then re-parse and execute the command. | 
 | .It exec Op Ar command arg ... | 
 | Unless command is omitted, the shell process is replaced with the | 
 | specified program (which must be a real program, not a shell builtin 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. | 
 | .It 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 is used. | 
 | .It export Ar name ... | 
 | .It export Fl p | 
 | The specified names are exported so that they will appear in the | 
 | environment of subsequent commands. | 
 | The only way to un-export a variable is to unset it. | 
 | The shell allows the value of a variable to be set at the | 
 | same time it is exported by writing | 
 | .Pp | 
 | .Dl export name=value | 
 | .Pp | 
 | With no arguments the export command lists the names of all exported variables. | 
 | With the | 
 | .Fl p | 
 | option specified the output will be formatted suitably for non-interactive use. | 
 | .It Xo fc Op Fl e Ar editor | 
 | .Op Ar first Op Ar last | 
 | .Xc | 
 | .It Xo fc Fl l | 
 | .Op Fl nr | 
 | .Op Ar first Op Ar last | 
 | .Xc | 
 | .It Xo fc Fl s Op Ar old=new | 
 | .Op Ar first | 
 | .Xc | 
 | The | 
 | .Ic fc | 
 | builtin lists, or edits and re-executes, commands previously entered | 
 | to an interactive shell. | 
 | .Bl -tag -width 5n | 
 | .It Fl e No editor | 
 | Use the editor named by editor to edit the commands. | 
 | The 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 -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 first | 
 | .It 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 first or last or both are one of the following: | 
 | .Bl -tag -width 5n | 
 | .It [+]number | 
 | A positive number representing a command number; command numbers can be | 
 | displayed with the | 
 | .Fl l | 
 | option. | 
 | .It Fl 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 string | 
 | A string indicating the most recently entered command that begins with | 
 | that string. | 
 | If the old=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 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 fg Op Ar job | 
 | Move the specified job or the current job to the foreground. | 
 | .It getopts Ar optstring var | 
 | The | 
 | .Tn POSIX | 
 | .Ic getopts | 
 | command, not to be confused with the | 
 | .Em Bell Labs | 
 | -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 | 
 | builtin 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 | 
 | .Va 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 | 
 | builtin will place it in the shell variable | 
 | .Ev OPTARG . | 
 | If an option is not allowed for in the | 
 | .Va optstring , | 
 | then | 
 | .Ev OPTARG | 
 | will be unset. | 
 | .Pp | 
 | .Va 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 white space. | 
 | If an option character is not found where expected, | 
 | .Ic getopts | 
 | will set the variable | 
 | .Va var | 
 | to a | 
 | .Dq \&? ; | 
 | .Ic getopts | 
 | will then unset | 
 | .Ev OPTARG | 
 | and write output to standard error. | 
 | By specifying a colon as the first character of | 
 | .Va 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 | 
 | .Va var | 
 | to the special option, | 
 | .Dq -- , | 
 | otherwise, it will set | 
 | .Va var | 
 | to | 
 | .Dq \&? . | 
 | .Pp | 
 | The following code fragment shows how one might process the arguments | 
 | for a command that can take the options | 
 | .Op a | 
 | and | 
 | .Op b , | 
 | and the option | 
 | .Op c , | 
 | which requires an argument. | 
 | .Pp | 
 | .Bd -literal -offset indent | 
 | while getopts abc: f | 
 | do | 
 | 	case $f in | 
 | 	a | b)	flag=$f;; | 
 | 	c)	carg=$OPTARG;; | 
 | 	\\?)	echo $USAGE; exit 1;; | 
 | 	esac | 
 | done | 
 | shift `expr $OPTIND - 1` | 
 | .Ed | 
 | .Pp | 
 | This code will accept any of the following as equivalent: | 
 | .Pp | 
 | .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 hash Fl rv 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 inputrc Ar file | 
 | Read the | 
 | .Va file | 
 | to set keybindings as defined by | 
 | .Xr editrc 5 . | 
 | .It jobid Op Ar job | 
 | Print the process id's of the processes in the job. | 
 | If the | 
 | .Ar job | 
 | argument is omitted, the current job is used. | 
 | .It jobs | 
 | This command lists out all the background processes | 
 | which are children of the current shell process. | 
 | .It 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 printed value. | 
 | .Pp | 
 | The default is | 
 | .Ic pwd | 
 | .Fl L , | 
 | but note that the builtin | 
 | .Ic cd | 
 | command doesn't currently support | 
 | .Fl L | 
 | or | 
 | .Fl P | 
 | and will cache (almost) the absolute path. | 
 | If | 
 | .Ic cd | 
 | is changed, | 
 | .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 builtin command may differ from the program of the same name because | 
 | the program will use | 
 | .Ev PWD | 
 | and the builtin uses a separately cached value. | 
 | .It Xo read Op Fl p Ar prompt | 
 | .Op Fl r | 
 | .Ar variable | 
 | .Op Ar ... | 
 | .Xc | 
 | The 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 section on word splitting | 
 | 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 | 
 | builtin 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 readonly Ar name ... | 
 | .It readonly Fl p | 
 | 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 readonly command lists the names of all read only | 
 | variables. | 
 | With the | 
 | .Fl p | 
 | option specified the output will be formatted suitably for non-interactive use. | 
 | .Pp | 
 | .It Xo set | 
 | .Oo { | 
 | .Fl options | Cm +options | Cm -- } | 
 | .Oc Ar arg ... | 
 | .Xc | 
 | The | 
 | .Ic set | 
 | command performs three different functions. | 
 | .Pp | 
 | With no arguments, it lists the values of all shell variables. | 
 | .Pp | 
 | If options are given, it sets the specified option | 
 | flags, or clears them as described in the section called | 
 | .Sx Argument List Processing . | 
 | .Pp | 
 | The third use of the set command is to set the values of the shell's | 
 | positional parameters to the specified args. | 
 | To change the positional | 
 | parameters without changing any options, use | 
 | .Dq -- | 
 | as the first argument to set. | 
 | If no args are present, the set command | 
 | will clear all the positional parameters (equivalent to executing | 
 | .Dq shift $# . ) | 
 | .It setvar Ar variable Ar value | 
 | Assigns value to variable. | 
 | (In general it is better to write | 
 | 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 shift Op Ar n | 
 | Shift the positional parameters n times. | 
 | A | 
 | .Ic shift | 
 | sets the value of | 
 | .Va $1 | 
 | to the value of | 
 | .Va $2 , | 
 | the value of | 
 | .Va $2 | 
 | to the value of | 
 | .Va $3 , | 
 | and so on, decreasing | 
 | the value of | 
 | .Va $# | 
 | by one. | 
 | If there are zero positional parameters, | 
 | .Ic shift | 
 | does nothing. | 
 | .It Xo trap | 
 | .Op Fl l | 
 | .Xc | 
 | .It Xo trap | 
 | .Op Ar action | 
 | .Ar signal ... | 
 | .Xc | 
 | 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 , | 
 | the action is executed when the shell exits. | 
 | .Ar action | 
 | may be null, which cause the specified signals to be ignored. | 
 | With | 
 | .Ar action | 
 | omitted or set to `-' the specified signals are set to their default action. | 
 | When the shell forks off a subshell, it resets trapped (but not ignored) | 
 | signals to the default action. | 
 | The | 
 | .Ic trap | 
 | command has no effect on signals that were | 
 | ignored on entry to the shell. | 
 | Issuing | 
 | .Ic trap | 
 | with option | 
 | .Ar -l | 
 | will print a list of valid signal names. | 
 | .Ic trap | 
 | without any arguments cause it to write a list of signals and their | 
 | associated action to the standard output in a format that is suitable | 
 | as an input to the shell that achieves the same trapping results. | 
 | .Pp | 
 | Examples: | 
 | .Pp | 
 | .Dl trap | 
 | .Pp | 
 | List trapped signals and their corresponding action | 
 | .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 | 
 | Print date upon receiving signal INT | 
 | .It type Op Ar name ... | 
 | Interpret each name as a command and print the resolution of the command | 
 | search. | 
 | Possible resolutions are: | 
 | shell keyword, alias, shell builtin, | 
 | 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 ulimit Xo | 
 | .Op Fl H \*(Ba Fl S | 
 | .Op Fl a \*(Ba Fl tfdscmlpn Op Ar value | 
 | .Xc | 
 | 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. | 
 | 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. | 
 | .El | 
 | .Pp | 
 | .Bl -tag -width Fl | 
 | The limit to be interrogated or set, then, is chosen by specifying | 
 | any one of these flags: | 
 | .It Fl a | 
 | show all the current limits | 
 | .It Fl b | 
 | show or set the limit on the socket buffer size of a process (in bytes) | 
 | .It Fl t | 
 | show or set the limit on CPU time (in seconds) | 
 | .It Fl f | 
 | show or set the limit on the largest file that can be created | 
 | (in 512-byte blocks) | 
 | .It Fl d | 
 | show or set the limit on the data segment size of a process (in kilobytes) | 
 | .It Fl s | 
 | show or set the limit on the stack size of a process (in kilobytes) | 
 | .It Fl c | 
 | show or set the limit on the largest core dump size that can be produced | 
 | (in 512-byte blocks) | 
 | .It Fl m | 
 | show or set the limit on the total physical memory that can be | 
 | in use by a process (in kilobytes) | 
 | .It Fl l | 
 | show or set the limit on how much memory a process can lock with | 
 | .Xr mlock 2 | 
 | (in kilobytes) | 
 | .It Fl p | 
 | show or set the limit on the number of processes this user can | 
 | have at one time | 
 | .It Fl n | 
 | show or set the limit on the number of files a process can have open at once | 
 | .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. | 
 | .Pp | 
 | .It umask 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. | 
 | .It unalias Xo | 
 | .Op Fl a | 
 | .Op Ar name | 
 | .Xc | 
 | If | 
 | .Ar name | 
 | is specified, the shell removes that alias. | 
 | If | 
 | .Fl a | 
 | is specified, all aliases are removed. | 
 | .It unset Ar name ... | 
 | The specified variables and functions are unset and unexported. | 
 | If a given name corresponds to both a variable and a function, both | 
 | the variable and the function are unset. | 
 | .It wait Op Ar job | 
 | Wait for the specified job to complete and return the exit status of the | 
 | last process in the job. | 
 | If the argument is omitted, wait for all jobs to | 
 | complete and then return an exit status of zero. | 
 | .El | 
 | .Ss Command Line Editing | 
 | When | 
 | .Nm | 
 | is being used interactively from a terminal, the current command | 
 | and the command history (see | 
 | .Ic fc | 
 | in | 
 | .Sx Builtins ) | 
 | can be edited using emacs-mode or vi-mode command-line editing. | 
 | The command | 
 | .Ql set -o emacs | 
 | enables emacs-mode editing. | 
 | The command | 
 | .Ql set -o vi | 
 | enables vi-mode editing and places sh 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, sh can be switched between insert mode and command mode. | 
 | It's similar to vi: typing | 
 | .Aq ESC | 
 | will throw you into command VI command mode. | 
 | Hitting | 
 | .Aq return | 
 | while in command mode will pass the line to the shell. | 
 | .Pp | 
 | The emacs mode uses commands similar to a subset available in | 
 | the 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. | 
 | .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 builtin is used with a numeric argument, it will return the | 
 | argument. | 
 | .Sh ENVIRONMENT | 
 | .Bl -tag -width MAILCHECK | 
 | .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 | 
 | cd builtin. | 
 | .It Ev PATH | 
 | The default search path for executables. | 
 | See the above section | 
 | .Sx Path Search . | 
 | .It Ev CDPATH | 
 | The search path used with the cd builtin. | 
 | .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 Ev MAIL | 
 | The name of a mail file, that will be checked for the arrival of new mail. | 
 | Overridden by | 
 | .Ev MAILPATH . | 
 | .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 PS1 | 
 | The primary prompt string, which defaults to | 
 | .Dq $ \  , | 
 | unless you are the superuser, in which case it defaults to | 
 | .Dq # \  . | 
 | .It Ev PS2 | 
 | The secondary prompt string, which defaults to | 
 | .Dq \*[Gt] \  . | 
 | .It Ev PS4 | 
 | Output before each line when execution trace (set -x) is enabled, | 
 | defaults to | 
 | .Dq + \  . | 
 | .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 TERM | 
 | The default terminal setting for the shell. | 
 | This is inherited by | 
 | children of the shell, and is used in the history editing modes. | 
 | .It Ev HISTSIZE | 
 | The number of lines in the history buffer for the shell. | 
 | .El | 
 | .Sh FILES | 
 | .Bl -item -width HOMEprofilexxxx | 
 | .It | 
 | .Pa $HOME/.profile | 
 | .It | 
 | .Pa /etc/profile | 
 | .El | 
 | .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 environ 7 , | 
 | .Xr nls 7 , | 
 | .Xr sysctl 8 | 
 | .Sh HISTORY | 
 | A | 
 | .Nm | 
 | command appeared in | 
 | .At v1 . | 
 | It 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 | 
 | PS1, PS2, and PS4 should be subject to parameter expansion before | 
 | being displayed. |