Man Linux: Main Page and Category List

NAME

       rc,  cd,  eval,  exec,  exit,  flag, rfork, shift, wait, whatis, ., ~ -
       command 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 rcs 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
       executed  in  sequence  from  left  to  right.   Rc does not wait for a
       command followed by & to finish executing before starting the following
       command.   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(3)); 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
       character.

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

   Simple Commands
       A  simple  command  is  a  sequence  of arguments interspersed with I/O
       redirections.  If the first argument is the name of an rc  function  or
       of  one  of rcs 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(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 /bin/rc),
       prefixed 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  rcs  syntax  requires  an
       argument  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 pattern for matching against
       file names.  The character * matches  any  sequence  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  between  the  two.   The
       character  /  must  appear  explicitly  in a pattern, as must the first
       character of the path name components .  and ...  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,      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
              syntax 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
              element  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.  Subscripts can also take the
              form m-n or m- to indicate a sequence of elements.   Assignments
              to variables are described 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
              elements 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
              separators.  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
              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 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
              concatenated pairwise.  If not, then one operand must  have  one
              component, and the other must be non-empty, and concatenation is
              distributive.

   Free Carets
       In most circumstances, rc will  insert  the  ^  operator  automatically
       between 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
       command 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 unquoted, variable  names  of  the  form  $word  have  their  values
       substituted  from  rcs  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
       descriptor and fd0 becomes a new copy (in the sense of dup(3))  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
       effects:  the  first  puts  standard  output in /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
       /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
       standard 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
       operator is && the right command is  executed  if  the  left  command’s
       status is null.  || causes the right command to be executed if the left
       command’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
       precedence, 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)
              command.    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
              argument  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
              executed.  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
              operator  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.
              Subsequently, whenever a command whose first argument is name is
              encountered, 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(3).  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
              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.

   Built-in Commands
       These commands are executed internally by  rc,  usually  because  their
       execution 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 [nNeEsfFm]
              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
              default 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; F is RFCFDG; and m is RFNOMNT.
       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
       binaries  by  the  kernel.   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  separated
       by  SOH  (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
                restored 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  parsing  the  $PATH  variable  (as   in   sh(1))   or   by
                path=(. /bin).   The  variables $path and $PATH are maintained
                together: changes to one will be reflected in the other.
       $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
                required   to  complete  the  command.   If  not  set  in  the
                environment, 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
       input.   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
                  command.
       -i         If -i is present, or  rc  is  given  no  arguments  and  its
                  standard   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,
                  before 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

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

       Free carets don’t get inserted next to keywords.

       The <{command}  syntax  depends  on  the  underlying  operating  system
       providing a file descriptor device tree at /dev/fd.

       By  default, FreeBSD 5 does not provide file descriptors greater than 2
       in /dev/fd.  To fix this, add

              /fdescfs    /dev/fd    fdescfs    rw    0    0

       to /etc/fstab, and then mount  /dev/fd.   (Adding  the  line  to  fstab
       ensures  causes  FreeBSD to mount the file system automatically at boot
       time.)

                                                                         RC(1)