glenda.party
term% ls -F
term% pwd
$home/manuals/plan9_2nd/1/rc
term% cat index.txt
RC(1)                       General Commands Manual                      RC(1)

NAME
       rc, cd, eval, exec, exit, flag, rfork, shift, wait, whatis, ., ~ - com‐
       mand language

SYNOPSIS
       rc [ -srdiIlxepvV ] [ -c command ] [ file [ arg ...  ]

DESCRIPTION
       Rc is the Plan 9 shell.  It executes command lines read from a terminal
       or a file or, with the -c flag, from rc's argument list.

   Command Lines
       A  command  line  is a sequence of commands, separated by ampersands or
       semicolons (& or ;), terminated by a newline.  The  commands  are  exe‐
       cuted  in  sequence from left to right.  Rc does not wait for a command
       followed by & to finish executing before starting  the  following  com‐
       mand.   Whenever a command followed by & is executed, its process id is
       assigned to the rc variable $apid.  Whenever a command not followed  by
       &  exits  or  is terminated, the rc variable $status gets the process's
       wait message (see wait(2)); it will be the null string if  the  command
       was successful.

       A  long  command  line may be continued on subsequent lines by typing a
       backslash (\) followed by a  newline.   This  sequence  is  treated  as
       though  it  were a blank.  Backslash is not otherwise a special charac‐
       ter.

       A number-sign (#) and any following characters up to (but  not  includ‐
       ing) the next newline are ignored, except in quotation marks.

   Simple Commands
       A simple command is a sequence of arguments interspersed with I/O redi‐
       rections.   If  the  first argument is the name of an rc function or of
       one of rc's built-in commands, it is executed by rc.  Otherwise if  the
       name  starts  with a slash (/), 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 $path.  The first executable file
       of the given name found in a directory in $path is the  program  to  be
       executed.  To be executable, the user must have execute permission (see
       stat(2))  and the file must be either an executable binary for the cur‐
       rent machine's CPU type, or a shell script.  Shell scripts begin with a
       line containing the full path name of a shell (usually  /bin/rc),  pre‐
       fixed by

       The  first  word  of  a simple command cannot be a keyword unless it is
       quoted or otherwise disguised.  The keywords are
            for in while if not switch fn ~ ! @

   Arguments and Variables
       A number of constructions may be used where rc's syntax requires an ar‐
       gument to appear.  In many cases a construction's value will be a  list
       of arguments rather than a single string.

       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:
            # ; & | ^ $ = ‘ ' { } ( ) < >
       An  unquoted  word that contains any of the characters * ?  [ is a pat‐
       tern for matching against file names.  The character * matches any  se‐
       quence  of  characters,  ?   matches  any single character, and [class]
       matches any character in the class.  If the first character of class is
       ~, the class is complemented.  The class  may  also  contain  pairs  of
       characters  separated  by  -, standing for all characters lexically be‐
       tween the two.  The character / must appear explicitly in a pattern, as
       must the first character of the path name components .  and ...  A pat‐
       tern 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 af‐
       ter all other operations.  Thus,
            x=/tmp echo $x^/*.c
       matches /tmp/*.c, rather than matching /*.c and then prefixing /tmp.

       A  quoted  word is a sequence of characters surrounded by single quotes
       (').  A single quote is represented in a  quoted  word  by  a  pair  of
       quotes ('').

       Each of the following is an argument.
       (arguments)
              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 syn‐
              tax may suggest it.  The following are entirely equivalent:
                   echo hi there everybody
                   ((echo) (hi there) everybody)

       $argument
       $argument(subscript)
              The argument after the $ 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  argument is a number n, the value is the nth ele‐
              ment of $*, unless $* doesn't have n elements, in which case the
              value is empty.  If 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.  Assignments to variables are  de‐
              scribed below.
       $#argument
              The  value  is  the number of elements in the named variable.  A
              variable never assigned a value has zero elements.
       $"argument
              The value is a single string containing the  components  of  the
              named  variable  separated by spaces.  A variable with zero ele‐
              ments yields the empty string.
       ‘{command}
              rc executes the command and reads its standard output, splitting
              it into a list of arguments, using characters in $ifs as separa‐
              tors.  If $ifs is not otherwise set, its value is ' \t\n'.
       <{command}
       >{command}
              The command is executed asynchronously with its standard  output
              or  standard  input connected to a pipe.  The value of the argu‐
              ment 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  old  and  new  and
              uses cmp to compare their outputs
                   cmp <{old} <{new}

       argument^argument
              The  ^  operator  concatenates  its  two  operands.   If the two
              operands have the same number of components, they  are  concate‐
              nated  pairwise.   If not, then one operand must have one compo‐
              nent, and the other must be non-empty, and concatenation is dis‐
              tributive.

   Free Carets
       In most circumstances, rc will insert the ^ operator automatically  be‐
       tween words that are not separated by white space.  Whenever one of $ '
       ‘  follows  a  quoted  or  unquoted  word or an unquoted word follows a
       quoted word with no intervening blanks or tabs, a ^ is inserted between
       the two.  If an unquoted word immediately follows a $  and  contains  a
       character other than an alphanumeric, underscore, or *, a ^ is inserted
       before the first such character.  Thus

              cc -$flags $stem.c

       is equivalent to

              cc -^$flags $stem^.c

   I/O Redirections
       The  sequence >file redirects the standard output file (file descriptor
       1, normally the terminal) to the named file;  >>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
       <file,  or from an inline ‘here document' by the sequence <<eof-marker.
       The contents of a here document are lines of text taken from  the  com‐
       mand  input  stream up to a line containing nothing but the eof-marker,
       which may be either a quoted or unquoted word.  If  eof-marker  is  un‐
       quoted,  variable names of the form $word have their values substituted
       from rc's environment.  If $word is followed by a caret (^), the  caret
       is deleted.  If eof-marker is quoted, no substitution occurs.

       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 cc junk.c >[2]junk.

       A  file  descriptor  may be redirected to an already open descriptor by
       writing >[fd0=fd1] or <[fd0=fd1].  Fd1 is a previously opened file  de‐
       scriptor  and fd0 becomes a new copy (in the sense of dup(2)) of it.  A
       file descriptor may be closed by writing >[fd0=] or <[fd0=].

       Redirections are executed from left to  right.   Therefore,  cc  junk.c
       >/dev/null  >[2=1]  and  cc junk.c >[2=1] >/dev/null have different ef‐
       fects: the first puts standard output in /dev/null and then puts  diag‐
       nostic  output  in  the same place, where the second directs diagnostic
       output to the terminal and sends standard output to /dev/null.

   Compound Commands
       A pair of commands separated by a pipe operator (|) is a command.   The
       standard output of the left command is sent through a pipe to the stan‐
       dard input of the right command.  The pipe operator may be decorated to
       use  different  file descriptors.  |[fd] connects the output end of the
       pipe to file descriptor fd rather than 1.  |[fd0=fd1]  connects  output
       to fd1 of the left command and input to fd0 of the right command.

       A pair of commands separated by && or || is a command.  In either case,
       the  left command is executed and its exit status examined.  If the op‐
       erator is && the right command is executed if the left command's status
       is null.  || causes the right command to be executed if the  left  com‐
       mand's status is non-null.

       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 !.

       The | operator has highest precedence, and  is  left-associative  (i.e.
       binds  tighter to the left than the right).  !  has intermediate prece‐
       dence, and && and || have the lowest precedence.

       The unary @ operator, with precedence equal to !, causes its operand to
       be executed in a subshell.

       Each of the following is a command.
       if ( list ) command
              A list is a sequence of commands, separated by &, ;, or newline.
              It is executed and if its exit status is null,  the  command  is
              executed.
       if not command
              The  immediately  preceding command must have been if(list) com‐
              mand.  If its condition was non-zero, the command is executed.
       for(name in arguments) command
       for(name) command
              The command is executed once for each argument with  that  argu‐
              ment  assigned  to name.  If the argument list is omitted, $* is
              used.
       while(list) command
              The list is executed repeatedly until its exit  status  is  non-
              null.   Each  time  it  returns null status, the command is exe‐
              cuted.  An empty list is taken to give null status.
       switch(argument){list}
              The list is searched for simple commands beginning with the word
              case.  (The search is only at the ‘top level' of the list.  That
              is, cases in nested constructs  are  not  found.)   Argument  is
              matched  against  each  word  following  case using the pattern-
              matching algorithm described above, except that / and the  first
              characters of .  and ..  need not be matched explicitly.  When a
              match is found, commands in the list are executed up to the next
              following  case command (at the top level) or the closing brace.

       {list}
              Braces serve to alter the grouping of commands implied by opera‐
              tor priorities.  The body is a sequence of commands separated by
              &, ;, or newline.
       fn name{list}
       fn name
              The first form defines a function with the given  name.   Subse‐
              quently,  whenever a command whose first argument is name is en‐
              countered, the current value of the remainder of  the  command's
              argument  list  will be assigned to $*, after saving its current
              value, and rc will execute the list.  The  second  form  removes
              name's function definition.
       fn note{list}

       fn note
              A function with a special name will be called when rc receives a
              corresponding  note;  see  notify(2).  The valid note names (and
              corresponding notes) are sighup  (hangup),  sigint  (interrupt),
              sigalrm  (alarm),  and sigfpe (floating point trap).  By default
              rc exits on receiving any signal, except when run interactively,
              in which case interrupts and quits normally  cause  rc  to  stop
              whatever it's doing and start reading a new command.  The second
              form  causes  rc  to  handle a signal in the default manner.  Rc
              recognizes an artificial note, sigexit, which occurs when rc  is
              about to finish executing.
       name=argument command
              Any  command may be preceded by a sequence of assignments inter‐
              spersed with redirections.  The assignments remain in effect un‐
              til 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.

   Built-in Commands
       These commands are executed internally by rc, usually because their ex‐
       ecution changes or depends on rc's internal state.
       . file ...
              Execute commands from file.  $* is set for the duration  to  the
              remainder of the argument list following file.  File is searched
              for using $path.
       builtin command ...
              Execute  command as usual except that any function named command
              is ignored in favor of the built-in meaning.
       cd [dir]
              Change the current directory to dir.  The  default  argument  is
              $home.  dir is searched for in each of the directories mentioned
              in $cdpath.
       eval [arg ...]
              The arguments are concatenated separated by spaces into a single
              string, read as input to rc, and executed.
       exec [command ...]
              This  instance  of rc replaces itself with the given (non-built-
              in) command.
       flag f [+-]
              Either set (+), clear (-), or test (neither + nor -) the flag f,
              where f is a single character, one of  the  command  line  flags
              (see Invocation, below).
       exit [status]
              Exit  with the given exit status.  If none is given, the current
              value of $status is used.
       rfork [nNeEsfF]
              Become a new process group using  rfork(flags)  where  flags  is
              composed  of  the bitwise OR of the rfork flags specified by the
              option letters (see fork(2)).  If no flags are given,  they  de‐
              fault to ens.  The flags and their meanings are: n is RFNAMEG; N
              is  RFCNAMEG;  e  is  RFENVG;  E  is RFCENVG; s is RFNOTEG; f is
              RFFDG; and F is RFCFDG.
       shift [n]
              Delete the first n (default 1) elements of $*.
       wait [pid]
              Wait for the process with the given pid to exit.  If no  pid  is
              given, all outstanding processes are waited for.
       whatis name ...
              Print the value of each name in a form suitable for input to rc.
              The  output  is an assignment to any variable, the definition of
              any function, a call to builtin for any built-in command, or the
              completed pathname of any executable file.
       ~ subject pattern ...
              The subject is matched against each pattern in sequence.  If  it
              matches any pattern, $status is set to zero.  Otherwise, $status
              is set to one.  Patterns are the same as for file name matching,
              except  that / and the first character of .  and ..  need not be
              matched explicitly.  The patterns are not subjected to file name
              matching before the ~ command is executed, so they need  not  be
              enclosed in quotation marks.

   Environment
       The  environment is a list of strings made available to executing bina‐
       ries by the env device (see env(3)).  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 = and
       its value.  If the value has more than one component, these  are  sepa‐
       rated by ctrl-a ('\001') characters.  The string for a function is just
       the  rc input that defines the function.  The name of a function in the
       environment is the function name preceded by

       When rc starts executing it reads  variable  and  function  definitions
       from its environment.

   Special Variables
       The following variables are set or used by rc.
       $*       Set to rc's argument list during initialization.  Whenever a .
                command  or a function is executed, the current value is saved
                and $* receives the new argument list.  The saved value is re‐
                stored on completion of the .  or function.
       $apid    Whenever a process is started asynchronously with &, $apid  is
                set to its process id.
       $home    The default directory for cd.
       $ifs     The  input  field  separators used in backquote substitutions.
                If $ifs is not set in rc's environment, it is  initialized  to
                blank, tab and newline.
       $path    The  search path used to find commands and input files for the
                .  command.  If not set in the environment, it is  initialized
                by path=(. /bin).  Its use is discouraged; instead use bind(1)
                to build a /bin containing what's needed.
       $pid     Set during initialization to rc's process id.
       $prompt  When  rc  is run interactively, the first component of $prompt
                is printed before reading each command.  The second  component
                is  printed whenever a newline is typed and more lines are re‐
                quired to complete the command.  If not set  in  the  environ‐
                ment, it is initialized by prompt=('% ' ' ').
       $status  Set to the wait message of the last-executed program.  (unless
                started  with &).  !  and ~ also change $status.  Its value is
                used to control execution in &&, ||, if  and  while  commands.
                When  rc  exits at end-of-file of its input or on executing an
                exit command with no argument, $status is its exit status.

   Invocation
       If rc is started with no arguments it reads commands from standard  in‐
       put.   Otherwise its first non-flag argument is the name of a file from
       which to read commands (but see -c below).  Subsequent arguments become
       the initial value of $*.  Rc accepts the following command-line flags.
       -c string  Commands are read from string.
       -s         Print out exit status after any command where the status  is
                  non-null.
       -e         Exit  if  $status  is non-null after executing a simple com‐
                  mand.
       -i         If -i is present, or rc is given no arguments and its  stan‐
                  dard  input  is a terminal, it runs interactively.  Commands
                  are prompted for using $prompt.
       -I         Makes sure rc is not run interactively.
       -l         If -l is given or the first character of argument zero is -,
                  rc reads commands from $home/lib/profile, if it exists,  be‐
                  fore reading its normal input.
       -p         A no-op.
       -d         A no-op.
       -v         Echo input on file descriptor 2 as it is read.
       -x         Print each simple command before executing it.
       -r         Print  debugging  information  (internal form of commands as
                  they are executed).

SOURCE
       /sys/src/cmd/rc

SEE ALSO
       Tom Duff, ‘‘Rc - The Plan 9 Shell''.

BUGS
       There should be a way to match patterns against whole lists rather than
       just single strings.
       Using ~ to check the value of $status changes $status.
       Functions that use here documents don't work.

                                                                         RC(1)