Search:
+subject: rc - shell

RC(1)                                                       RC(1)



NAME
       rc - shell

SYNOPSIS
       rc [-eixvldnpo] [-c command] [arguments]

DESCRIPTION
       rc is a command interpreter and programming language simi-
       lar to sh(1).  It is based on the AT&T Plan 9 shell of the
       same name.  The shell offers a C-like syntax (much more so
       than the C shell), and a powerful mechanism for manipulat-
       ing  variables.   It  is  reasonably  small and reasonably
       fast, especially when  compared  to  contemporary  shells.
       Its  use  is  intended to be interactive, but the language
       lends itself well to scripts.

OPTIONS
       -e     If the -e option is present, then rc will  exit  if
              the  exit  status  of a command is false (nonzero).
              rc will not exit, however, if a conditional  fails,
              e.g., an if() command.

       -i     If  the  -i option is present or if the input to rc
              is from a terminal  (as  determined  by  isatty(3))
              then  rc  will  be in interactive mode.  That is, a
              prompt (from $prompt(1)) will be printed before  an
              input line is taken, and rc will ignore the signals
              SIGINT and SIGQUIT.

       -x     This option will make rc  print  every  command  on
              standard  error  before  it is executed.  It can be
              useful for debugging rc scripts.

       -v     This option will echo input to rc on standard error
              as it is read.

       -l     If  the -l option is present, or if rc's argv[0][0]
              is a dash (-), then  rc  will  behave  as  a  login
              shell.   That  is, it will try to run commands pre-
              sent in $home/.rcrc, if this  file  exists,  before
              reading any other input.

       -d     This  flag  causes  rc  not  to  ignore  SIGQUIT or
              SIGTERM.  Thus rc can be made to dump core if  sent
              SIGQUIT.   This option is only useful for debugging
              rc.

       -n     This flag causes rc to read its input and parse it,
              but  not  to  execute any commands.  This is useful
              for syntax checking on scripts.  If used in  combi-
              nation  with the -x option, rc will print each com-
              mand as it is parsed in a form similar to  the  one
              used  for exporting functions into the environment.

       -p     This flag prevents rc from initializing shell func-
              tions  from the environment.  This allows rc to run
              in a protected mode, whereby it becomes more diffi-
              cult  for  an  rc script to be subverted by placing
              false commands in the environment.  (Note that this
              presence  of  this  option does NOT mean that it is
              safe to run setuid rc scripts;  the  usual  caveats
              about the setuid bit still apply.)

       -o     This  flag prevents the usual practice of trying to
              open /dev/null on file descriptors 0, 1, and 2,  if
              any of those descriptors are inherited closed.

       -c     If  -c  is  present, commands are executed from the
              immediately following argument.  Any further  argu-
              ments to rc are placed in $*.


COMMANDS
       A  simple  command  is  a  sequence of words, separated by
       white space (space and tab) characters that  ends  with  a
       newline,  semicolon (;), or ampersand (&).  The first word
       of a command is the name of that  command.   If  the  name
       begins  with  /,  ./,  or ../, then the name is used as an
       absolute path name referring to an executable file.   Oth-
       erwise, the name of the command is looked up in a table of
       shell functions, builtin commands, or as  a  file  in  the
       directories named by $path.

   Background Tasks
       A  command  ending with a & is run in the background; that
       is, the shell returns immediately rather than waiting  for
       the   command   to  complete.   Background  commands  have
       /dev/null connected to  their  standard  input  unless  an
       explicit redirection for standard input is used.

   Subshells
       A  command  prefixed  with an at-sign (@) is executed in a
       subshell.   This  insulates  the  parent  shell  from  the
       effects  of  state  changing  operations such as a cd or a
       variable assignment.  For example:

            @ {cd ..; make}

       will run make(1) in the parent directory (..), but  leaves
       the shell running in the current directory.

   Line continuation
       A long logical line may be continued over several physical
       lines by terminating each line (except the  last)  with  a
       backslash  (\).  The backslash-newline sequence is treated
       as a space.  A backslash is not otherwise special  to  rc.
       (In  addition, inside quotes a backslash loses its special
       meaning even when it is followed by a newline.)

   Quoting
       rc interprets several characters specially; special  char-
       acters automatically terminate words.  The following char-
       acters are special:

            # ; & | ^ $ = ` ' { } ( ) < >

       The single quote (') prevents  special  treatment  of  any
       character  other  than  itself.  All characters, including
       control characters, newlines, and backslashes between  two
       quote  characters  are treated as an uninterpreted string.
       A quote character itself may  be  quoted  by  placing  two
       quotes in a row.  The minimal sequence needed to enter the
       quote character is ''''.  The empty string is  represented
       by ''.  Thus:

            echo 'What''s the plan, Stan?'

       prints out

            What's the plan, Stan?

       The  number  sign (#) begins a comment in rc.  All charac-
       ters up to but not including the next newline are ignored.
       Note  that  backslash  continuation does not work inside a
       comment, i.e., the backslash is ignored along with  every-
       thing else.

   Grouping
       Zero  or more commands may be grouped within braces (``{''
       and ``}''), and are then treated as one  command.   Braces
       do not otherwise define scope; they are used only for com-
       mand grouping.  In particular, be wary of the command:

            for (i) {
                command
            } | command

       Since pipe binds tighter than for, this command  does  not
       perform what the user expects it to.  Instead, enclose the
       whole for statement in braces:

            {for (i) command} | command

       Fortunately, rc's grammar is simple enough that a  (confi-
       dent)  user  can  understand  it by examining the skeletal
       yacc(1) grammar at the end of this man page (see the  sec-
       tion entitled GRAMMAR).

   Input and output
       The standard output may be redirected to a file with

            command > file

       and the standard input may be taken from a file with

            command < file

       File descriptors other than 0 and 1 may be specified also.
       For example, to redirect standard error to a file, use:

            command >[2] file

       In order to duplicate a file descriptor, use >[n=m].  Thus
       to redirect both standard output and standard error to the
       same file, use

            command > file >[2=1]

       To close a file descriptor that may be  open,  use  >[n=].
       For example, to close file descriptor 7:

            command >[7=]

       In order to place the output of a command at the end of an
       already existing file, use:

            command >> file

       If the file does not exist, then it is created.

       ``Here documents'' are supported as in sh with the use of

            command << 'eof-marker'

       If the end-of-file marker is enclosed in quotes,  then  no
       variable  substitution  occurs  inside  the here document.
       Otherwise, every variable is substituted by its space-sep-
       arated-list  value  (see  Flat  Lists,  below), and if a ^
       character follows a variable name, it  is  deleted.   This
       allows  the unambiguous use of variables adjacent to text,
       as in

            $variable^follow

       To include a literal $ in a here document when an unquoted
       end-of-file marker is being used, enter it as $$.

       Additionally, rc supports ``here strings'', which are like
       here documents, except that input is taken directly from a
       string on the command line.  Its use is illustrated here:

            cat <<< 'this is a here string' | wc

       (This  feature  enables  rc to export functions using here
       documents into the environment; the author does not expect
       users to find this feature useful.)

   Pipes
       Two  or  more  commands  may  be combined in a pipeline by
       placing the vertical bar (|) between them.   The  standard
       output  (file  descriptor 1) of the command on the left is
       tied to the standard input (file descriptor 0) of the com-
       mand  on  the  right.   The notation |[n=m] indicates that
       file descriptor n of the left process is connected to file
       descriptor  m  of  the right process.  |[n] is a shorthand
       for |[n=0].  As an example, to pipe the standard error  of
       a command to wc(1), use:

            command |[2] wc

       The  exit  status  of a pipeline is considered true if and
       only if every command in the pipeline exits true.

   Commands as Arguments
       Some commands, like cmp(1) or diff(1),  take  their  argu-
       ments  on  the  command  line,  and do not read input from
       standard input.  It is convenient sometimes to build  non-
       linear  pipelines  so that a command like cmp can read the
       output of two other commands at once.   rc  does  it  like
       this:

            cmp <{command} <{command}

       compares  the  output  of  the  two commands in braces.  A
       note: since this form of redirection is  implemented  with
       some  kind  of  pipe,  and  since one cannot lseek(2) on a
       pipe, commands that use lseek(2) will hang.  For  example,
       most versions of diff(1) use lseek(2) on their inputs.

       Data  can  be  sent  down a pipe to several commands using
       tee(1) and the output version of this notation:

            echo hi there | tee >{sed 's/^/p1 /'} >{sed 's/^/p2 /'}

CONTROL STRUCTURES
       The following may be used for control flow in rc:

   If-else Statements
       if (test) {
           cmd
       } else cmd
              The test is executed, and if its return  status  is
              zero,  the first command is executed, otherwise the
              second is.  Braces are  not  mandatory  around  the
              commands.  However, an else statement is valid only
              if it follows a close-brace on the same line.  Oth-
              erwise, the if is taken to be a simple-if:

                   if (test)
                       command

   While and For Loops
       while (test) cmd
              rc  executes  the  test and performs the command as
              long as the test is true.

       for (var in list) cmd
              rc sets var to each element of list (which may con-
              tain  variables  and  backquote  substitutions) and
              runs cmd.  If ``in list'' is omitted, then rc  will
              set  var to each element of $* (excluding $0).  For
              example:

                   for (i in `{ls -F | grep '\*$' | sed 's/\*$//'}) { commands }

              will set $i to the name of each file in the current
              directory that is executable.

   Switch
       switch (list) { case ... }
              rc  looks  inside  the  braces  after  a switch for
              statements beginning with the word case.  If any of
              the patterns following case match the list supplied
              to switch, then the commands up until the next case
              statement are executed.  The metacharacters *, [ or
              ?  should not be quoted; matching is performed only
              against  the  strings  in  list,  not  against file
              names.  (Matching for case statements is  the  same
              as for the ~ command.)

   Logical Operators
       There  are a number of operators in rc which depend on the
       exit status of a command.

            command && command

       executes the first command and then  executes  the  second
       command if and only if the first command exits with a zero
       exit status (``true'' in Unix).

            command || command

       executes the first command and then  executes  the  second
       command  if  and  only  if  the first command exits with a
       nonzero exit status (``false'' in Unix).

            ! command

       negates the exit status of a command.

PATTERN MATCHING
       There are two forms of pattern matching  in  rc.   One  is
       traditional  shell  globbing.  This occurs in matching for
       file names in argument lists:

            command argument argument ...

       When the characters *, [ or ?  occur  in  an  argument  or
       command,  rc looks at the argument as a pattern for match-
       ing against files.  (Contrary to the behavior other shells
       exhibit,  rc  will  only  perform  pattern  matching  if a
       metacharacter occurs unquoted and literally in the  input.
       Thus,

            foo='*'
            echo $foo

       will  always  echo  just a star.  In order for non-literal
       metacharacters to be expanded, an eval statement  must  be
       used  in  order  to  rescan  the input.)  Pattern matching
       occurs according to the following rules: a *  matches  any
       number  (including  zero) of characters.  A ?  matches any
       single character, and a [ followed by a number of  charac-
       ters  followed  by  a ] matches a single character in that
       class.  The rules for character  class  matching  are  the
       same as those for ed(1), with the exception that character
       class negation is achieved with the  tilde  (~),  not  the
       caret (^), since the caret already means something else in
       rc.

       rc also matches patterns against strings with the  ~  com-
       mand:

            ~ subject pattern pattern ...

       ~  sets  $status to zero if and only if a supplied pattern
       matches any single element of the subject list.  Thus

            ~ foo f*

       sets status to zero, while

            ~ (bar baz) f*

       sets status to one.  The null list is matched by the  null
       list, so

            ~ $foo ()

       checks to see whether $foo is empty or not.  This may also
       be achieved by the test

            ~ $#foo 0

       Note that inside a ~ command rc does  not  match  patterns
       against  file  names,  so it is not necessary to quote the
       characters *, [ and ?.  However, rc does expand  the  glob
       the  subject  against filenames if it contains metacharac-
       ters.  Thus, the command

            ~ * ?

       returns true if any of the files in the current  directory
       have a single-character name.  (Note that if the ~ command
       is given a list as its first argument, then  a  successful
       match  against any of the elements of that list will cause
       ~ to return true.  For example:

            ~ (foo goo zoo) z*

       is true.)

LISTS AND VARIABLES
       The primary data structure in rc is the list, which  is  a
       sequence  of  words.  Parentheses are used to group lists.
       The empty list is represented by ().  Lists have no  hier-
       archical structure; a list inside another list is expanded
       so the outer list contains all the elements of  the  inner
       list.  Thus, the following are all equivalent

            one two three

            (one two three)

            ((one) () ((two three)))

       Note  that the null string, '', and the null list, (), are
       two very different things.  Assigning the null  string  to
       variable  is a valid operation, but it does not remove its
       definition.  For example, if $a is set to  '',  then  $#a,
       returns a 1.

   List Concatenation
       Two lists may be joined by the concatenation operator (^).
       A single word is treated as a list of length one, so

            echo foo^bar

       produces the output

            foobar

       For lists of more than one  element,  concatenation  works
       according  to  the  following rules: if the two lists have
       the same number of elements, then concatenation  is  pair-
       wise:

            echo (a- b- c-)^(1 2 3)

       produces the output

            a-1 b-2 c-3

       Otherwise,  one  of  the lists must have a single element,
       and then the concatenation is distributive:

            cc -^(O g c) (malloc alloca)^.c

       has the effect of performing the command

            cc -O -g -c malloc.c alloca.c

   Free Carets
       rc inserts carets (concatenation operators)  for  free  in
       certain  situations,  in  order to save some typing on the
       user's behalf.  For example, the above example could  also
       be typed in as:

            opts=(O g c) files=(malloc alloca) cc -$opts $files.c

       rc takes care to insert a free-caret between the ``-'' and
       $opts, as well as between $files and  .c.   The  rule  for
       free  carets is as follows:  if a word or keyword is imme-
       diately followed by another word, keyword, dollar-sign  or
       backquote, then rc inserts a caret between them.

   Variables
       A list may be assigned to a variable, using the notation:

            var = list

       Any  sequence of non-special characters, except a sequence
       including only digits, may be used  as  a  variable  name.
       All  user-defined variables are exported into the environ-
       ment.

       The value of a variable is referenced with the notation:

            $var

       Any variable which has not been assigned a  value  returns
       the null list, (), when referenced.  In addition, multiple
       references are allowed:

            a=foo
            b=a
            echo $$b

       prints

            foo

       A variable's definition may also be removed  by  assigning
       the null list to a variable:

            var=()

       For ``free careting'' to work correctly, rc must make cer-
       tain assumptions about what characters  may  appear  in  a
       variable  name.   rc assumes that a variable name consists
       only of alphanumeric characters, underscore (_)  and  star
       (*).  To reference a variable with other characters in its
       name, quote the variable name.  Thus:

            echo $'we$Irdriab!le'

   Local Variables
       Any number of variable assignments may be made local to  a
       single command by typing:

            a=foo b=bar ... command

       The command may be a compound command, so for example:

            path=. ifs=() {
                ...
            }

       sets  path  to  .  and removes ifs for the duration of one
       long compound command.

   Variable Subscripts
       Variables may be subscripted with the notation

            $var(n)

       where n is a list of integers (origin  1).   The  list  of
       subscripts need not be in order or even unique.  Thus, if

            a=(one two three)

       then

            echo $a(3 3 3)

       prints

            three three three

       If  n  references  a  nonexistent  element,  then  $var(n)
       returns the null list.  The notation $n,  where  n  is  an
       integer,  is  a shorthand for $*(n).  Thus, rc's arguments
       may be referred to as $1, $2, and so on.

       Note also that the list of subscripts may be given by  any
       of rc's list operations:

            $var(`{awk 'BEGIN{for(i=1;i<=10;i++)print i;exit; }'})

       returns the first 10 elements of $var.

       To count the number of elements in a variable, use

            $#var

       This  returns  a  single-element  list, with the number of
       elements in $var.

   Flat Lists
       In order to create a single-element list from a multi-ele-
       ment list, with the components space-separated, use

            $^var

       This  is  useful  when the normal list concatenation rules
       need to be bypassed.  For  example,  to  append  a  single
       period at the end of $path, use:

            echo $^path.

   Backquote Substitution
       A list may be formed from the output of a command by using
       backquote substitution:

            `{ command }

       returns a list formed from the standard output of the com-
       mand  in  braces.   $ifs  is used to split the output into
       list elements.  By default, $ifs has the value  space-tab-
       newline.   The  braces  may be omitted if the command is a
       single word.  Thus `ls may be used instead of `{ls}.  This
       last feature is useful when defining functions that expand
       to useful argument lists.  A frequent use is:

            fn src { echo *.[chy] }

       followed by

            wc `src

       (This will print out a word-count of all C source files in
       the current directory.)

       In  order to override the value of $ifs for a single back-
       quote substitution, use:

            `` (ifs-list) { command }

       $ifs will be temporarily ignored and the command's  output
       will  be  split  as  specified  by  the list following the
       double backquote.  For example:

            `` ($nl :) {cat /etc/passwd}

       splits up /etc/passwd into fields, assuming that $nl  con-
       tains a newline as its value.

SPECIAL VARIABLES
       Several  variables  are  known  to rc and are treated spe-
       cially.

       *      The argument list of rc.  $1, $2, etc. are the same
              as  $*(1),  $*(2),  etc.  The variable $0 holds the
              value of argv[0] with which rc was invoked.   Addi-
              tionally,  $0  is set to the name of a function for
              the duration of the execution of that function, and
              $0 is also set to the name of the file being inter-
              preted for the duration of a .  command.

       apid   The process ID of the last process started  in  the
              background.

       apids  The  process  IDs of any background processes which
              are outstanding or which have  died  and  have  not
              been waited for yet.

       cdpath A list of directories to search for the target of a
              cd command.  The empty string stands for  the  cur-
              rent  directory.  Note that if the $cdpath variable
              does not contain the current  directory,  then  the
              current directory will not be searched; this allows
              directory searching to begin in a  directory  other
              than  the  current  directory.   Note  also that an
              assignment to $cdpath causes an  automatic  assign-
              ment to $CDPATH, and vice-versa.

       history
              $history  contains the name of a file to which com-
              mands are appended as rc reads them.  This  facili-
              tates  the  use  of  a  stand-alone history program
              (such as history(1)) which parses the  contents  of
              the  history file and presents them to rc for rein-
              terpretation.  If $history is not set, then rc does
              not append commands to any file.

       home   The  default  directory  for the builtin cd command
              and is the directory in which rc looks to find  its
              initialization  file, .rcrc, if rc has been started
              up as a login shell.   Like  $cdpath  and  $CDPATH,
              $home and $HOME are aliased to each other.

       ifs    The internal field separator, used for splitting up
              the output of backquote commands for digestion as a
              list.

       path   This is a list of directories to search in for com-
              mands.  The empty string  stands  for  the  current
              directory.   Note  that  like  $cdpath and $CDPATH,
              $path and $PATH are  aliased  to  each  other.   If
              $path  or  $PATH  is not set at startup time, $path
              assumes a default value suitable for  your  system.
              This is typically (/usr/ucb /usr/bin /bin .)

       pid    The process ID of the currently running rc.

       prompt This  variable holds the two prompts (in list form,
              of course) that rc prints.  $prompt(1)  is  printed
              before  each  command  is  read,  and $prompt(2) is
              printed when input is expected to continue  on  the
              next  line.   rc  sets  $prompt  to  (';  '  '') by
              default.  The reason for this is that it enables an
              rc  user to grab commands from previous lines using
              a mouse, and to present them to rc for re-interpre-
              tation;  the  semicolon prompt is simply ignored by
              rc.  The null $prompt(2) also  has  its  justifica-
              tion:  an rc script, when typed interactively, will
              not leave  $prompt(2)'s  on  the  screen,  and  can
              therefore be grabbed by a mouse and placed directly
              into a file for use as a shell script, without fur-
              ther editing being necessary.

       prompt (function)
              If  this  function  is  set,  then it gets executed
              every time rc is about to print $prompt(1).

       status The exit status of the last command.  If  the  com-
              mand  exited  with  a numeric value, that number is
              the status.  If the died with a signal, the  status
              is the name of that signal; if a core file was cre-
              ated, the string ``+core'' is appended.  The  value
              of  $status  for  a  pipeline  is  a list, with one
              entry, as above, for each process in the  pipeline.
              For example, the command

                   ls | wc

              usually sets $status to (0 0).

       The  values  of $path, $cdpath, and $home are derived from
       the environment values of $PATH, $CDPATH, and $HOME.  Oth-
       erwise,  they  are  derived from the environment values of
       $path, $cdpath and $home.  This is for compatibility  with
       other  Unix  programs,  like sh(1).  $PATH and $CDPATH are
       assumed to be colon-separated lists.

FUNCTIONS
       rc functions are identical to rc scripts, except that they
       are  stored  in memory and are automatically exported into
       the environment.  A shell function is declared as:

            fn name { commands }

       rc scans the definition  until  the  close-brace,  so  the
       function  can span more than one line.  The function defi-
       nition may be removed by typing

            fn name

       (One or more names may be specified.  With an accompanying
       definition,  all  names receive the same definition.  This
       is sometimes useful for assigning the same signal  handler
       to  many  signals.   Without a definition, all named func-
       tions are deleted.)  When a function is  executed,  $*  is
       set  to the arguments to that function for the duration of
       the command.  Thus a reasonable definition for l, a short-
       hand for ls(1), could be:

            fn l { ls -FC $* }

       but not

            fn l { ls -FC }

INTERRUPTS AND SIGNALS
       rc  recognizes a number of signals, and allows the user to
       define shell functions which act as signal  handlers.   rc
       by  default  traps  SIGINT when it is in interactive mode.
       SIGQUIT and  SIGTERM  are  ignored,  unless  rc  has  been
       invoked  with  the  -d flag.  However, user-defined signal
       handlers may be written for these and all  other  signals.
       The  way to define a signal handler is to write a function
       by the name of the signal in lower case.  Thus:

            fn sighup { echo hangup; rm /tmp/rc$pid.*; exit }

       In addition to Unix signals, rc recognizes the  artificial
       signal SIGEXIT which occurs as rc is about to exit.

       In  order  to remove a signal handler's definition, remove
       it as though it were a regular function.  For example:

            fn sigint

       returns the handler of SIGINT to the  default  value.   In
       order  to  ignore a signal, set the signal handler's value
       to {}.  Thus:

            fn sigint {}

       causes SIGINT to be ignored by the  shell.   Only  signals
       that  are  being  ignored are passed on to programs run by
       rc; signal functions are not exported.

       On System V-based Unix systems, rc will not allow  you  to
       trap SIGCLD.

BUILTIN COMMANDS
       Builtin  commands execute in the context of the shell, but
       otherwise behave exactly like other commands.  Although !,
       ~  and  @ are not strictly speaking builtin commands, they
       can usually be used as such.

       . [-i] file [arg ...]
              Reads file as input to rc  and  executes  its  con-
              tents.  With a -i flag, input is interactive.  Thus
              from within a shell script,

                   . -i /dev/tty

              does the ``right'' thing.

       break  Breaks from the innermost for or while,  as  in  C.
              It  is  an error to invoke break outside of a loop.
              (Note that there is no break keyword  between  com-
              mands in switch statements, unlike C.)

       builtin command [arg ...]
              Executes  the command ignoring any function defini-
              tion of the same name.  This command is present  to
              allow  functions with the same names as builtins to
              use the underlying builtin or binary.

       cd [directory]
              Changes the current directory  to  directory.   The
              variable $cdpath is searched for possible locations
              of directory, analogous to the searching  of  $path
              for executable files.  With no argument, cd changes
              the current directory to $home.

       echo [-n] [--] [arg ...]
              Prints its arguments to standard output, terminated
              by  a  newline.  Arguments are separated by spaces.
              If the first argument is -n  no  final  newline  is
              printed.   If  the  first  argument is --, then all
              other arguments are echoed literally.  This is used
              for echoing a literal -n.

       eval [list]
              Concatenates  the  elements of list with spaces and
              feeds the resulting string to rc  for  re-scanning.
              This is the only time input is rescanned in rc.

       exec [arg ...]
              Replaces  rc  with  the given command.  If the exec
              contains only redirections, then these redirections
              apply  to  the current shell and the shell does not
              exit.  For example,

                   exec >[2] err.out

              places further output to standard error in the file
              err.out.

       exit [status]
              Cause the current shell to exit with the given exit
              status.  If no argument is given, the current value
              of $status is used.

       limit [-h] [resource [value]]
              Similar  to  the csh(1) limit builtin, this command
              operates upon the BSD-style limits  of  a  process.
              The  -h  flag displays/alters the hard limits.  The
              resources  which  can  be  shown  or  altered   are
              cputime,  filesize,  datasize, stacksize, coredump-
              size and memoryuse.  For example:

                   limit coredumpsize 0

              disables core dumps.

       newpgrp
              Puts rc into a new process group.  This builtin  is
              useful  for  making  rc  behave  like a job-control
              shell in a hostile environment.  One example is the
              NeXT  Terminal  program,  which  implicitly assumes
              that each shell it forks will put itself into a new
              process group.

       return [n]
              Returns  from  the current function, with status n,
              where n is a single value or  a  list  of  possible
              exit statuses.  Thus it is legal to have

                   return (sigpipe 1 2 3)

              (This  is  commonly  used  to  allow  a function to
              return with the exit status of  a  previously  exe-
              cuted pipeline of commands.)  If n is omitted, then
              $status is left  unchanged.   It  is  an  error  to
              invoke return when not inside a function.

       shift [n]
              Deletes  n  elements  from  the beginning of $* and
              shifts the other elements down by n.  n defaults to
              1.  (Note that $0 is not affected by shift.)

       umask [mask]
              Sets  the current umask (see umask(2)) to the octal
              mask.  If no argument is present, the current  mask
              value is printed.

       wait [pid]
              Waits  for  the specified pid, which must have been
              started by rc.  If no pid is  specified,  rc  waits
              for all child processes to exit.

       whatis [-s] [--] [name ...]
              Prints  a  definition  of  the  named objects.  For
              variables, their values are printed; for functions,
              their  definitions  are;  and for executable files,
              path names are printed.  Without arguments,  whatis
              prints  the values of all shell variables and func-
              tions.  With a -s argument, whatis also prints  out
              a  list of available signals and their handlers (if
              any).  Note that  whatis  output  is  suitable  for
              input  to  rc;  by saving the output of whatis in a
              file, it should be possible to recreate  the  state
              of  rc  by  sourcing  this  file with a .  command.
              Another note: whatis -s > file cannot  be  used  to
              store  the state of rc's signal handlers in a file,
              because builtins with redirections  are  run  in  a
              subshell, and rc always restores signal handlers to
              their default value after a fork().

              Since whatis uses getopt(3) to parse its arguments,
              you  can  use  the special argument -- to terminate
              its options.  This allows you to use  names  begin-
              ning  with a dash, such as the history(1) commands.
              For example,

                   whatis -- -p

GRAMMAR
       Here is rc's grammar, edited to remove semantic actions.

            %term ANDAND BACKBACK BANG CASE COUNT DUP ELSE END FLAT FN FOR IF IN
            %term OROR PIPE REDIR SUB SUBSHELL SWITCH TWIDDLE WHILE WORD HUH

            %left WHILE ')' ELSE
            %left ANDAND OROR '\n'
            %left BANG SUBSHELL
            %left PIPE
            %right '$'
            %left SUB

            %start rc

            %%

            rc: line end
                 | error end

            end: END /* EOF */ | '\n'

            cmdsa: cmd ';' | cmd '&'

            line: cmd | cmdsa line

            body: cmd | cmdsan body

            cmdsan: cmdsa | cmd '\n'

            brace: '{' body '}'

            paren: '(' body ')'

            assign: first '=' word

            epilog: /* empty */ | redir epilog

            redir: DUP | REDIR word

            case: CASE words ';' | CASE words '\n'

            cbody: cmd | case cbody | cmdsan cbody

            iftail: cmd    %prec ELSE
                 | brace ELSE optnl cmd

            cmd  : /* empty */  %prec WHILE
                 | simple
                 | brace epilog
                 | IF paren optnl iftail
                 | FOR '(' word IN words ')' optnl cmd
                 | FOR '(' word ')' optnl cmd
                 | WHILE paren optnl cmd
                 | SWITCH '(' word ')' optnl '{' cbody '}'
                 | TWIDDLE optcaret word words
                 | cmd ANDAND optnl cmd
                 | cmd OROR optnl cmd
                 | cmd PIPE optnl cmd
                 | redir cmd    %prec BANG
                 | assign cmd   %prec BANG
                 | BANG optcaret cmd
                 | SUBSHELL optcaret cmd
                 | FN words brace
                 | FN words

            optcaret: /* empty */ | '^'

            simple: first | simple word | simple redir

            first: comword | first '^' sword

            sword: comword | keyword

            word: sword | word '^' sword

            comword: '$' sword
                 | '$' sword SUB words ')'
                 | COUNT sword
                 | FLAT sword
                 | '`' sword
                 | '`' brace
                 | BACKBACK word     brace | BACKBACK word sword
                 | '(' words ')'
                 | REDIR brace
                 | WORD

            keyword: FOR | IN | WHILE | IF | SWITCH
                 | FN | ELSE | CASE | TWIDDLE | BANG | SUBSHELL

            words: /* empty */ | words word

            optnl: /* empty */ | optnl '\n'

FILES
       $HOME/.rcrc, /tmp/rc*, /dev/null

CREDITS
       rc was written by Byron Rakitzis, with valuable help  from
       Paul  Haahr,  Hugh  Redelmeier  and  David Sanderson.  The
       design of this shell has been copied from the rc that  Tom
       Duff wrote at Bell Labs.

BUGS
       On  systems that support /dev/fd, <{foo} style redirection
       is implemented that way.  However, on other systems it  is
       implemented with named pipes, and it is sometimes possible
       to foil rc into removing the FIFO it places in /tmp prema-
       turely, or it is even possible to cause rc to hang.

       The  functionality  of shift should be available for vari-
       ables other than $*.

       echo is built in only for performance reasons, which is  a
       bad idea.

       There should be a way to avoid exporting a variable.

       The  $^var  notation for flattening should allow for using
       an arbitrary separating character, not just space.

       Bug reports should be mailed to byron@archone.tamu.edu.

INCOMPATIBILITIES
       Here is a list of features which distinguish this incarna-
       tion  of rc from the one described in the Bell Labs manual
       pages:

       The treatment of if-else is different in the v10 rc:  that
       version  uses  an if not clause which gets executed if the
       preceding if test does not succeed.

       Backquotes are slightly different in v10 rc:  a  backquote
       must always be followed by a left-brace.  This restriction
       is not present for single-word commands in this rc.

       The following are all new with this version of rc: The  -n
       option,  the  list flattening operator, here strings (they
       facilitate exporting of functions with here documents into
       the  environment), the return and break keywords, the echo
       builtin, the support for the GNU readline(3)  library  and
       the support for the prompt function.  This rc also sets $0
       to the  name  of  a  function  being  executed/file  being
       sourced.

SEE ALSO
       ``rc  --  A  Shell  for  Plan  9  and UNIX Systems'', Unix
       Research System, 10th Edition, vol. 2.  (Saunders  College
       Publishing)  (This  paper is also distributed with this rc
       in PostScript form.)

       history(1)



                          28 April 1991                     RC(1)