|  | .TH RC 1 | 
|  | .SH NAME | 
|  | rc, cd, eval, exec, exit, flag, rfork, shift, wait, whatis, ., ~ \- command language | 
|  | .SH SYNOPSIS | 
|  | .B rc | 
|  | [ | 
|  | .B -srdiIlxepvV | 
|  | ] | 
|  | [ | 
|  | .B -c command | 
|  | ] | 
|  | [ | 
|  | .I file | 
|  | [ | 
|  | .I arg ... | 
|  | ]] | 
|  | .SH DESCRIPTION | 
|  | .I Rc | 
|  | is the Plan 9 shell. | 
|  | It executes command lines read from a terminal or a file or, with the | 
|  | .B -c | 
|  | flag, from | 
|  | .I rc's | 
|  | argument list. | 
|  | .SS Command Lines | 
|  | A command line is a sequence of commands, separated by ampersands or semicolons | 
|  | .RB ( & | 
|  | or | 
|  | .BR ; ), | 
|  | terminated by a newline. | 
|  | The commands are executed in sequence | 
|  | from left to right. | 
|  | .I Rc | 
|  | does not wait for a command followed by | 
|  | .B & | 
|  | to finish executing before starting | 
|  | the following command. | 
|  | Whenever a command followed by | 
|  | .B & | 
|  | is executed, its process id is assigned to the | 
|  | .I rc | 
|  | variable | 
|  | .BR $apid . | 
|  | Whenever a command | 
|  | .I not | 
|  | followed by | 
|  | .B & | 
|  | exits or is terminated, the | 
|  | .I rc | 
|  | variable | 
|  | .B $status | 
|  | gets the process's wait message (see | 
|  | .IR wait (3)); | 
|  | it will be the null string if the command was successful. | 
|  | .PP | 
|  | A long command line may be continued on subsequent lines by typing | 
|  | a backslash | 
|  | .RB ( \e ) | 
|  | followed by a newline. | 
|  | This sequence is treated as though it were a blank. | 
|  | Backslash is not otherwise a special character. | 
|  | .PP | 
|  | A number-sign | 
|  | .RB ( # ) | 
|  | and any following characters up to (but not including) the next newline | 
|  | are ignored, except in quotation marks. | 
|  | .SS Simple Commands | 
|  | A simple command is a sequence of arguments interspersed with I/O redirections. | 
|  | If the first argument is the name of an | 
|  | .I rc | 
|  | function or of one of | 
|  | .I rc's | 
|  | built-in commands, it is executed by | 
|  | .IR rc . | 
|  | Otherwise if the name starts with a slash | 
|  | .RB ( / ), | 
|  | it must be the path name of the program to be executed. | 
|  | Names containing no initial slash are searched for in | 
|  | a list of directory names stored in | 
|  | .BR $path . | 
|  | The first executable file of the given name found | 
|  | in a directory in | 
|  | .B $path | 
|  | is the program to be executed. | 
|  | To be executable, the user must have execute permission (see | 
|  | .IR stat (3)) | 
|  | and the file must be either an executable binary | 
|  | for the current machine's CPU type, or a shell script. | 
|  | Shell scripts begin with a line containing the full path name of a shell | 
|  | (usually | 
|  | .BR /bin/rc ), | 
|  | prefixed by | 
|  | .LR #! . | 
|  | .PP | 
|  | The first word of a simple command cannot be a keyword unless it is | 
|  | quoted or otherwise disguised. | 
|  | The keywords are | 
|  | .EX | 
|  | for in while if not switch fn ~ ! @ | 
|  | .EE | 
|  | .SS Arguments and Variables | 
|  | A number of constructions may be used where | 
|  | .I rc's | 
|  | syntax requires an argument to appear. | 
|  | In many cases a construction's | 
|  | value will be a list of arguments rather than a single string. | 
|  | .PP | 
|  | The simplest kind of argument is the unquoted word: | 
|  | a sequence of one or more characters none of which is a blank, tab, | 
|  | newline, or any of the following: | 
|  | .EX | 
|  | # ; & | ^ $ = ` ' { } ( ) < > | 
|  | .EE | 
|  | An unquoted word that contains any of the characters | 
|  | .B * | 
|  | .B ? | 
|  | .B [ | 
|  | is a pattern for matching against file names. | 
|  | The character | 
|  | .B * | 
|  | matches any sequence of characters, | 
|  | .B ? | 
|  | matches any single character, and | 
|  | .BI [ class ] | 
|  | matches any character in the | 
|  | .IR class . | 
|  | If the first character of | 
|  | .I class | 
|  | is | 
|  | .BR ~ , | 
|  | the class is complemented. | 
|  | The | 
|  | .I class | 
|  | may also contain pairs of characters separated by | 
|  | .BR - , | 
|  | standing for all characters lexically between the two. | 
|  | The character | 
|  | .B / | 
|  | must appear explicitly in a pattern, as must the | 
|  | first character of the path name components | 
|  | .B . | 
|  | and | 
|  | .BR .. . | 
|  | A pattern is replaced by a list of arguments, one for each path name matched, | 
|  | except that a pattern matching no names is not replaced by the empty list, | 
|  | but rather stands for itself. | 
|  | Pattern matching is done after all other | 
|  | operations. | 
|  | Thus, | 
|  | .EX | 
|  | x=/tmp echo $x^/*.c | 
|  | .EE | 
|  | matches | 
|  | .BR /tmp/*.c , | 
|  | rather than matching | 
|  | .B "/*.c | 
|  | and then prefixing | 
|  | .BR /tmp . | 
|  | .PP | 
|  | A quoted word is a sequence of characters surrounded by single quotes | 
|  | .RB ( ' ). | 
|  | A single quote is represented in a quoted word by a pair of quotes | 
|  | .RB ( '' ). | 
|  | .PP | 
|  | Each of the following is an argument. | 
|  | .PD 0 | 
|  | .HP | 
|  | .BI ( arguments ) | 
|  | .br | 
|  | The value of a sequence of arguments enclosed in parentheses is | 
|  | a list comprising the members of each element of the sequence. | 
|  | Argument lists have no recursive structure, although their syntax may | 
|  | suggest it. | 
|  | The following are entirely equivalent: | 
|  | .EX | 
|  | echo hi there everybody | 
|  | ((echo) (hi there) everybody) | 
|  | .EE | 
|  | .HP | 
|  | .BI $ argument | 
|  | .HP | 
|  | .BI $ argument ( subscript ) | 
|  | .br | 
|  | The | 
|  | .I argument | 
|  | after the | 
|  | .B $ | 
|  | is the name of a variable whose value is substituted. | 
|  | Multiple levels | 
|  | of indirection are possible, but of questionable utility. | 
|  | Variable values | 
|  | are lists of strings. | 
|  | If | 
|  | .I argument | 
|  | is a number | 
|  | .IR n , | 
|  | the value is the | 
|  | .IR n th | 
|  | element of | 
|  | .BR $* , | 
|  | unless | 
|  | .B $* | 
|  | doesn't have | 
|  | .I n | 
|  | elements, in which case the value is empty. | 
|  | If | 
|  | .I argument | 
|  | is followed by a parenthesized list of subscripts, the | 
|  | value substituted is a list composed of the requested elements (origin 1). | 
|  | The parenthesis must follow the variable name with no spaces. | 
|  | Subscripts can also take the form | 
|  | .IB m - n | 
|  | or | 
|  | .IB m - | 
|  | to indicate a sequence of elements. | 
|  | Assignments to variables are described below. | 
|  | .HP | 
|  | .BI $# argument | 
|  | .br | 
|  | The value is the number of elements in the named variable. | 
|  | A variable | 
|  | never assigned a value has zero elements. | 
|  | .HP | 
|  | $"\c | 
|  | .I argument | 
|  | .br | 
|  | The value is a single string containing the components of the named variable | 
|  | separated by spaces.  A variable with zero elements yields the empty string. | 
|  | .HP | 
|  | .BI `{ command } | 
|  | .br | 
|  | .I rc | 
|  | executes the | 
|  | .I command | 
|  | and reads its standard output, splitting it into a list of arguments, | 
|  | using characters in | 
|  | .B $ifs | 
|  | as separators. | 
|  | If | 
|  | .B $ifs | 
|  | is not otherwise set, its value is | 
|  | .BR "'\ \et\en'" . | 
|  | .HP | 
|  | .BI <{ command } | 
|  | .HP | 
|  | .BI >{ command } | 
|  | .br | 
|  | The | 
|  | .I command | 
|  | is executed asynchronously with its standard output or standard input | 
|  | connected to a pipe. | 
|  | The value of the argument is the name of a file | 
|  | referring to the other end of the pipe. | 
|  | This allows the construction of | 
|  | non-linear pipelines. | 
|  | For example, the following runs two commands | 
|  | .B old | 
|  | and | 
|  | .B new | 
|  | and uses | 
|  | .B cmp | 
|  | to compare their outputs | 
|  | .EX | 
|  | cmp <{old} <{new} | 
|  | .EE | 
|  | .HP | 
|  | .BI <>{ command } | 
|  | .br | 
|  | The | 
|  | .I command | 
|  | is executed asynchronously with its standard input and | 
|  | output each connected to a pipe.  The value of the argument | 
|  | is a pair of file names referring to the two other ends | 
|  | of the pipes, in the order corresponding to the symbols | 
|  | .B < | 
|  | and | 
|  | .B > | 
|  | (first the pipe connected to the command's standard output, | 
|  | then the pipe connected to its standard input). | 
|  | .HP | 
|  | .IB argument ^ argument | 
|  | .br | 
|  | The | 
|  | .B ^ | 
|  | operator concatenates its two operands. | 
|  | If the two operands | 
|  | have the same number of components, they are concatenated pairwise. | 
|  | If not, | 
|  | then one operand must have one component, and the other must be non-empty, | 
|  | and concatenation is distributive. | 
|  | .PD | 
|  | .SS Free Carets | 
|  | In most circumstances, | 
|  | .I rc | 
|  | will insert the | 
|  | .B ^ | 
|  | operator automatically between words that are not separated by white space. | 
|  | Whenever one of | 
|  | .B $ | 
|  | .B ' | 
|  | .B ` | 
|  | follows a quoted or unquoted word or an unquoted word follows a quoted word | 
|  | with no intervening blanks or tabs, | 
|  | a | 
|  | .B ^ | 
|  | is inserted between the two. | 
|  | If an unquoted word immediately follows a | 
|  | .BR $ | 
|  | and contains a character other than an alphanumeric, underscore, | 
|  | or | 
|  | .BR * , | 
|  | a | 
|  | .B ^ | 
|  | is inserted before the first such character. | 
|  | Thus | 
|  | .IP | 
|  | .B cc -$flags $stem.c | 
|  | .LP | 
|  | is equivalent to | 
|  | .IP | 
|  | .B cc -^$flags $stem^.c | 
|  | .SS I/O Redirections | 
|  | The sequence | 
|  | .BI > file | 
|  | redirects the standard output file (file descriptor 1, normally the | 
|  | terminal) to the named | 
|  | .IR file ; | 
|  | .BI >> file | 
|  | appends standard output to the file. | 
|  | The standard input file (file descriptor 0, also normally the terminal) | 
|  | may be redirected from a file by the sequence | 
|  | .BI < file \f1, | 
|  | or from an inline `here document' | 
|  | by the sequence | 
|  | .BI << eof-marker\f1. | 
|  | The contents of a here document are lines of text taken from the command | 
|  | input stream up to a line containing nothing but the | 
|  | .IR eof-marker , | 
|  | which may be either a quoted or unquoted word. | 
|  | If | 
|  | .I eof-marker | 
|  | is unquoted, variable names of the form | 
|  | .BI $ word | 
|  | have their values substituted from | 
|  | .I rc's | 
|  | environment. | 
|  | If | 
|  | .BI $ word | 
|  | is followed by a caret | 
|  | .RB ( ^ ), | 
|  | the caret is deleted. | 
|  | If | 
|  | .I eof-marker | 
|  | is quoted, no substitution occurs. | 
|  | .PP | 
|  | Redirections may be applied to a file-descriptor other than standard input | 
|  | or output by qualifying the redirection operator | 
|  | with a number in square brackets. | 
|  | For example, the diagnostic output (file descriptor 2) | 
|  | may be redirected by writing | 
|  | .BR "cc junk.c >[2]junk" . | 
|  | .PP | 
|  | A file descriptor may be redirected to an already open descriptor by writing | 
|  | .BI >[ fd0 = fd1 ] | 
|  | or | 
|  | .BI <[ fd0 = fd1 ]\f1. | 
|  | .I Fd1 | 
|  | is a previously opened file descriptor and | 
|  | .I fd0 | 
|  | becomes a new copy (in the sense of | 
|  | .IR dup (3)) | 
|  | of it. | 
|  | A file descriptor may be closed by writing | 
|  | .BI >[ fd0 =] | 
|  | or | 
|  | .BI <[ fd0 =]\f1. | 
|  | .PP | 
|  | Redirections are executed from left to right. | 
|  | Therefore, | 
|  | .B cc junk.c >/dev/null >[2=1] | 
|  | and | 
|  | .B cc junk.c >[2=1] >/dev/null | 
|  | have different effects: the first puts standard output in | 
|  | .BR /dev/null | 
|  | and then puts diagnostic output in the same place, where the second | 
|  | directs diagnostic output to the terminal and sends standard output to | 
|  | .BR /dev/null . | 
|  | .SS Compound Commands | 
|  | A pair of commands separated by a pipe operator | 
|  | .RB ( | ) | 
|  | is a command. | 
|  | The standard output of the left command is sent through a pipe | 
|  | to the standard input of the right command. | 
|  | The pipe operator may be decorated | 
|  | to use different file descriptors. | 
|  | .BI |[ fd ] | 
|  | connects the output end of the pipe to file descriptor | 
|  | .I fd | 
|  | rather than 1. | 
|  | .BI |[ fd0 = fd1 ] | 
|  | connects output to | 
|  | .I fd1 | 
|  | of the left command and input to | 
|  | .I fd0 | 
|  | of the right command. | 
|  | .PP | 
|  | A pair of commands separated by | 
|  | .B && | 
|  | or | 
|  | .B || | 
|  | is a command. | 
|  | In either case, the left command is executed and its exit status examined. | 
|  | If the operator is | 
|  | .B && | 
|  | the right command is executed if the left command's status is null. | 
|  | .B || | 
|  | causes the right command to be executed if the left command's status is non-null. | 
|  | .PP | 
|  | The exit status of a command may be inverted (non-null is changed to null, null | 
|  | is changed to non-null) by preceding it with a | 
|  | .BR ! . | 
|  | .PP | 
|  | The | 
|  | .B | | 
|  | operator has highest precedence, and is left-associative (i.e. binds tighter | 
|  | to the left than the right). | 
|  | .B ! | 
|  | has intermediate precedence, and | 
|  | .B && | 
|  | and | 
|  | .B || | 
|  | have the lowest precedence. | 
|  | .PP | 
|  | The unary | 
|  | .B @ | 
|  | operator, with precedence equal to | 
|  | .BR ! , | 
|  | causes its operand to be executed in a subshell. | 
|  | .PP | 
|  | Each of the following is a command. | 
|  | .PD 0 | 
|  | .HP | 
|  | .B if ( | 
|  | .I list | 
|  | .B ) | 
|  | .I command | 
|  | .br | 
|  | A | 
|  | .I list | 
|  | is a sequence of commands, separated by | 
|  | .BR & , | 
|  | .BR ; , | 
|  | or newline. | 
|  | It is executed and | 
|  | if its exit status is null, the | 
|  | .I command | 
|  | is executed. | 
|  | .HP | 
|  | .B if not | 
|  | .I command | 
|  | .br | 
|  | The immediately preceding command must have been | 
|  | .BI if( list ) | 
|  | .IR command . | 
|  | If its condition was non-zero, the | 
|  | .I command | 
|  | is executed. | 
|  | .HP | 
|  | .BI for( name | 
|  | .B in | 
|  | .IB arguments ) | 
|  | .I command | 
|  | .HP | 
|  | .BI for( name ) | 
|  | .I command | 
|  | .br | 
|  | The | 
|  | .I command | 
|  | is executed once for each | 
|  | .IR argument | 
|  | with that argument assigned to | 
|  | .IR name . | 
|  | If the argument list is omitted, | 
|  | .B $* | 
|  | is used. | 
|  | .HP | 
|  | .BI while( list ) | 
|  | .I command | 
|  | .br | 
|  | The | 
|  | .I list | 
|  | is executed repeatedly until its exit status is non-null. | 
|  | Each time it returns null status, the | 
|  | .I command | 
|  | is executed. | 
|  | An empty | 
|  | .I list | 
|  | is taken to give null status. | 
|  | .HP | 
|  | .BI "switch(" argument "){" list } | 
|  | .br | 
|  | The | 
|  | .IR list | 
|  | is searched for simple commands beginning with the word | 
|  | .BR case . | 
|  | (The search is only at the `top level' of the | 
|  | .IR list . | 
|  | That is, | 
|  | .B cases | 
|  | in nested constructs are not found.) | 
|  | .I Argument | 
|  | is matched against each word following | 
|  | .B case | 
|  | using the pattern-matching algorithm described above, except that | 
|  | .B / | 
|  | and the first characters of | 
|  | .B . | 
|  | and | 
|  | .B .. | 
|  | need not be matched explicitly. | 
|  | When a match is found, commands in the list are executed up to the next | 
|  | following | 
|  | .B case | 
|  | command (at the top level) or the closing brace. | 
|  | .HP | 
|  | .BI { list } | 
|  | .br | 
|  | Braces serve to alter the grouping of commands implied by operator | 
|  | priorities. | 
|  | The | 
|  | .I body | 
|  | is a sequence of commands separated by | 
|  | .BR & , | 
|  | .BR ; , | 
|  | or newline. | 
|  | .HP | 
|  | .BI "fn " name { list } | 
|  | .HP | 
|  | .BI "fn " name | 
|  | .br | 
|  | The first form defines a function with the given | 
|  | .IR name . | 
|  | Subsequently, whenever a command whose first argument is | 
|  | .I name | 
|  | is encountered, the current value of | 
|  | the remainder of the command's argument list will be assigned to | 
|  | .BR $* , | 
|  | after saving its current value, and | 
|  | .I rc | 
|  | will execute the | 
|  | .IR list . | 
|  | The second form removes | 
|  | .IR name 's | 
|  | function definition. | 
|  | .HP | 
|  | .BI "fn " note { list } | 
|  | .br | 
|  | .HP | 
|  | .BI "fn " note | 
|  | .br | 
|  | A function with a special name will be called when | 
|  | .I rc | 
|  | receives a corresponding note; see | 
|  | .IR notify (3). | 
|  | The valid note names (and corresponding notes) are | 
|  | .B sighup | 
|  | .RB ( hangup ), | 
|  | .B sigint | 
|  | .RB ( interrupt ), | 
|  | .BR sigalrm | 
|  | .RB ( alarm ), | 
|  | and | 
|  | .B sigfpe | 
|  | (floating point trap). | 
|  | By default | 
|  | .I rc | 
|  | exits on receiving any signal, except when run interactively, | 
|  | in which case interrupts and quits normally cause | 
|  | .I rc | 
|  | to stop whatever it's doing and start reading a new command. | 
|  | The second form causes | 
|  | .I rc | 
|  | to handle a signal in the default manner. | 
|  | .I Rc | 
|  | recognizes an artificial note, | 
|  | .BR sigexit , | 
|  | which occurs when | 
|  | .I rc | 
|  | is about to finish executing. | 
|  | .HP | 
|  | .IB name = "argument command" | 
|  | .br | 
|  | Any command may be preceded by a sequence of assignments | 
|  | interspersed with redirections. | 
|  | The assignments remain in effect until the end of the command, unless | 
|  | the command is empty (i.e. the assignments stand alone), in which case | 
|  | they are effective until rescinded by later assignments. | 
|  | .PD | 
|  | .SS Built-in Commands | 
|  | These commands are executed internally by | 
|  | .IR rc , | 
|  | usually because their execution changes or depends on | 
|  | .IR rc 's | 
|  | internal state. | 
|  | .PD 0 | 
|  | .HP | 
|  | .BI . " file ..." | 
|  | .br | 
|  | Execute commands from | 
|  | .IR file . | 
|  | .B $* | 
|  | is set for the duration to the remainder of the argument list following | 
|  | .IR file . | 
|  | .I File | 
|  | is searched for using | 
|  | .BR $path . | 
|  | .HP | 
|  | .BI builtin " command ..." | 
|  | .br | 
|  | Execute | 
|  | .I command | 
|  | as usual except that any function named | 
|  | .I command | 
|  | is ignored in favor of the built-in meaning. | 
|  | .HP | 
|  | .BI "cd [" dir "]" | 
|  | .br | 
|  | Change the current directory to | 
|  | .IR dir . | 
|  | The default argument is | 
|  | .BR $home . | 
|  | .I dir | 
|  | is searched for in each of the directories mentioned in | 
|  | .BR $cdpath . | 
|  | .HP | 
|  | .BI "eval [" "arg ..." "]" | 
|  | .br | 
|  | The arguments are concatenated separated by spaces into a single string, | 
|  | read as input to | 
|  | .IR rc , | 
|  | and executed. | 
|  | .HP | 
|  | .BI "exec [" "command ..." "]" | 
|  | .br | 
|  | This instance of | 
|  | .I rc | 
|  | replaces itself with the given (non-built-in) | 
|  | .IR command . | 
|  | .HP | 
|  | .BI "flag " f " [+-]" | 
|  | .br | 
|  | Either set | 
|  | .RB ( + ), | 
|  | clear | 
|  | .RB ( - ), | 
|  | or test (neither | 
|  | .B + | 
|  | nor | 
|  | .BR - ) | 
|  | the flag | 
|  | .IR f , | 
|  | where | 
|  | .I f | 
|  | is a single character, one of the command line flags (see Invocation, below). | 
|  | .HP | 
|  | .BI "exit [" status "]" | 
|  | .br | 
|  | Exit with the given exit status. | 
|  | If none is given, the current value of | 
|  | .B $status | 
|  | is used. | 
|  | .HP | 
|  | .BR "rfork " [ nNeEsfFm ] | 
|  | .br | 
|  | Become a new process group using | 
|  | .BI rfork( flags ) | 
|  | where | 
|  | .I flags | 
|  | is composed of the bitwise OR of the | 
|  | .B rfork | 
|  | flags specified by the option letters | 
|  | (see | 
|  | .IR fork (2)). | 
|  | If no | 
|  | .I flags | 
|  | are given, they default to | 
|  | .BR ens . | 
|  | The | 
|  | .I flags | 
|  | and their meanings are: | 
|  | .B n | 
|  | is | 
|  | .BR RFNAMEG ; | 
|  | .B N | 
|  | is | 
|  | .BR RFCNAMEG ; | 
|  | .B e | 
|  | is | 
|  | .BR RFENVG ; | 
|  | .B E | 
|  | is | 
|  | .BR RFCENVG ; | 
|  | .B s | 
|  | is | 
|  | .BR RFNOTEG ; | 
|  | .B f | 
|  | is | 
|  | .BR RFFDG ; | 
|  | .B F | 
|  | is | 
|  | .BR RFCFDG ; | 
|  | and | 
|  | .B m | 
|  | is | 
|  | .BR RFNOMNT . | 
|  | .HP | 
|  | .BI "shift [" n "]" | 
|  | .br | 
|  | Delete the first | 
|  | .IR n | 
|  | (default 1) | 
|  | elements of | 
|  | .BR $* . | 
|  | .HP | 
|  | .BI "wait [" pid "]" | 
|  | .br | 
|  | Wait for the process with the given | 
|  | .I pid | 
|  | to exit. | 
|  | If no | 
|  | .I pid | 
|  | is given, all outstanding processes are waited for. | 
|  | .HP | 
|  | .BI whatis " name ..." | 
|  | .br | 
|  | Print the value of each | 
|  | .I name | 
|  | in a form suitable for input to | 
|  | .IR rc . | 
|  | The output is | 
|  | an assignment to any variable, | 
|  | the definition of any function, | 
|  | a call to | 
|  | .B builtin | 
|  | for any built-in command, or | 
|  | the completed pathname of any executable file. | 
|  | .HP | 
|  | .BI ~ " subject pattern ..." | 
|  | .br | 
|  | The | 
|  | .I subject | 
|  | is matched against each | 
|  | .I pattern | 
|  | in sequence. | 
|  | If it matches any pattern, | 
|  | .B $status | 
|  | is set to zero. | 
|  | Otherwise, | 
|  | .B $status | 
|  | is set to one. | 
|  | Patterns are the same as for file name matching, except that | 
|  | .B / | 
|  | and the first character of | 
|  | .B . | 
|  | and | 
|  | .B .. | 
|  | need not be matched explicitly. | 
|  | The | 
|  | .I patterns | 
|  | are not subjected to | 
|  | file name matching before the | 
|  | .B ~ | 
|  | command is executed, so they need not be enclosed in quotation marks. | 
|  | .PD | 
|  | .SS Environment | 
|  | The | 
|  | .I environment | 
|  | is a list of strings made available to executing binaries by the | 
|  | kernel. | 
|  | .I Rc | 
|  | creates an environment entry for each variable whose value is non-empty, | 
|  | and for each function. | 
|  | The string for a variable entry has the variable's name followed by | 
|  | .B = | 
|  | and its value. | 
|  | If the value has more than one component, these | 
|  | are separated by SOH (001) | 
|  | characters. | 
|  | The string for a function is just the | 
|  | .I rc | 
|  | input that defines the function. | 
|  | The name of a function in the environment is the function name | 
|  | preceded by | 
|  | .LR fn# . | 
|  | .PP | 
|  | When | 
|  | .I rc | 
|  | starts executing it reads variable and function definitions from its | 
|  | environment. | 
|  | .SS Special Variables | 
|  | The following variables are set or used by | 
|  | .IR rc . | 
|  | .PD 0 | 
|  | .TP \w'\fL$promptXX'u | 
|  | .B $* | 
|  | Set to | 
|  | .IR rc 's | 
|  | argument list during initialization. | 
|  | Whenever a | 
|  | .B . | 
|  | command or a function is executed, the current value is saved and | 
|  | .B $* | 
|  | receives the new argument list. | 
|  | The saved value is restored on completion of the | 
|  | .B . | 
|  | or function. | 
|  | .TP | 
|  | .B $apid | 
|  | Whenever a process is started asynchronously with | 
|  | .BR & , | 
|  | .B $apid | 
|  | is set to its process id. | 
|  | .TP | 
|  | .B $home | 
|  | The default directory for | 
|  | .BR cd . | 
|  | .TP | 
|  | .B $ifs | 
|  | The input field separators used in backquote substitutions. | 
|  | If | 
|  | .B $ifs | 
|  | is not set in | 
|  | .IR rc 's | 
|  | environment, it is initialized to blank, tab and newline. | 
|  | .TP | 
|  | .B $path | 
|  | The search path used to find commands and input files | 
|  | for the | 
|  | .B . | 
|  | command. | 
|  | If not set in the environment, it is initialized by | 
|  | parsing the | 
|  | .B $PATH | 
|  | variable | 
|  | (as in | 
|  | .IR sh (1)) | 
|  | or by | 
|  | .BR "path=(.\ /bin)" . | 
|  | The variables | 
|  | .B $path | 
|  | and | 
|  | .B $PATH | 
|  | are maintained together: changes to one will be reflected in the other. | 
|  | .\" Its use is discouraged; instead use | 
|  | .\" .IR bind (1) | 
|  | .\" to build a | 
|  | .\" .B /bin | 
|  | .\" containing what's needed. | 
|  | .TP | 
|  | .B $pid | 
|  | Set during initialization to | 
|  | .IR rc 's | 
|  | process id. | 
|  | .TP | 
|  | .B $prompt | 
|  | When | 
|  | .I rc | 
|  | is run interactively, the first component of | 
|  | .B $prompt | 
|  | is printed before reading each command. | 
|  | The second component is printed whenever a newline is typed and more lines | 
|  | are required to complete the command. | 
|  | If not set in the environment, it is initialized by | 
|  | .BR "prompt=('%\ '\ '\ ')" . | 
|  | .TP | 
|  | .B $status | 
|  | Set to the wait message of the last-executed program. | 
|  | (unless started with | 
|  | .BR &). | 
|  | .B ! | 
|  | and | 
|  | .B ~ | 
|  | also change | 
|  | .BR $status . | 
|  | Its value is used to control execution in | 
|  | .BR && , | 
|  | .BR || , | 
|  | .B if | 
|  | and | 
|  | .B while | 
|  | commands. | 
|  | When | 
|  | .I rc | 
|  | exits at end-of-file of its input or on executing an | 
|  | .B exit | 
|  | command with no argument, | 
|  | .B $status | 
|  | is its exit status. | 
|  | .PD | 
|  | .SS Invocation | 
|  | If | 
|  | .I rc | 
|  | is started with no arguments it reads commands from standard input. | 
|  | Otherwise its first non-flag argument is the name of a file from which | 
|  | to read commands (but see | 
|  | .B -c | 
|  | below). | 
|  | Subsequent arguments become the initial value of | 
|  | .BR $* . | 
|  | .I Rc | 
|  | accepts the following command-line flags. | 
|  | .PD 0 | 
|  | .TP \w'\fL-c\ \fIstring\fLXX'u | 
|  | .BI -c " string" | 
|  | Commands are read from | 
|  | .IR string . | 
|  | .TP | 
|  | .B -s | 
|  | Print out exit status after any command where the status is non-null. | 
|  | .TP | 
|  | .B -e | 
|  | Exit if | 
|  | .B $status | 
|  | is non-null after executing a simple command. | 
|  | .TP | 
|  | .B -i | 
|  | If | 
|  | .B -i | 
|  | is present, or | 
|  | .I rc | 
|  | is given no arguments and its standard input is a terminal, | 
|  | it runs interactively. | 
|  | Commands are prompted for using | 
|  | .BR $prompt . | 
|  | .TP | 
|  | .B -I | 
|  | Makes sure | 
|  | .I rc | 
|  | is not run interactively. | 
|  | .TP | 
|  | .B -l | 
|  | If | 
|  | .B -l | 
|  | is given or the first character of argument zero is | 
|  | .BR - , | 
|  | .I rc | 
|  | reads commands from | 
|  | .BR $home/lib/profile , | 
|  | if it exists, before reading its normal input. | 
|  | .TP | 
|  | .B -p | 
|  | A no-op. | 
|  | .TP | 
|  | .B -d | 
|  | A no-op. | 
|  | .TP | 
|  | .B -v | 
|  | Echo input on file descriptor 2 as it is read. | 
|  | .TP | 
|  | .B -x | 
|  | Print each simple command before executing it. | 
|  | .TP | 
|  | .B -r | 
|  | Print debugging information (internal form of commands | 
|  | as they are executed). | 
|  | .PD | 
|  | .SH SOURCE | 
|  | .B \*9/src/cmd/rc | 
|  | .SH "SEE ALSO" | 
|  | Tom Duff, | 
|  | ``Rc \- The Plan 9 Shell''. | 
|  | .SH BUGS | 
|  | There should be a way to match patterns against whole lists rather than | 
|  | just single strings. | 
|  | .PP | 
|  | Using | 
|  | .B ~ | 
|  | to check the value of | 
|  | .B $status | 
|  | changes | 
|  | .BR $status . | 
|  | .PP | 
|  | Functions that use here documents don't work. | 
|  | .PP | 
|  | Free carets don't get inserted next to keywords. | 
|  | .PP | 
|  | The | 
|  | .BI <{ command } | 
|  | syntax depends on the underlying operating system | 
|  | providing a file descriptor device tree at | 
|  | .BR /dev/fd . | 
|  | .PP | 
|  | Some FreeBSD installations | 
|  | does not provide file descriptors greater than 2 | 
|  | in | 
|  | .BR /dev/fd . | 
|  | To fix this, add | 
|  | .IP | 
|  | .EX | 
|  | /fdescfs    /dev/fd    fdescfs    rw    0    0 | 
|  | .EE | 
|  | .LP | 
|  | to | 
|  | .BR /etc/fstab , | 
|  | and then | 
|  | .B mount | 
|  | .BR /dev/fd . | 
|  | (Adding the line to | 
|  | .B fstab | 
|  | ensures causes FreeBSD to mount the file system | 
|  | automatically at boot time.) |