SH(I)                        4/18/73                        SH(I)







NAME

     sh  -  shell (command interpreter)



SYNOPSIS

     sh [ name [ arg1 ... [ arg9 ] ] ]



DESCRIPTION

     Sh is the standard command interpreter.  It is  the  program

     which  reads and arranges the execution of the command lines

     typed by most users.  It may itself be called as  a  command

     to  interpret  files  of  commands.   Before  discussing the

     arguments to the Shell used as a command, the  structure  of

     command lines themselves will be given.



     Commands.  Each command is a sequence of  non-blank  command

     arguments separated by blanks.  The first argument specifies

     the name of a command to be executed.   Except  for  certain

     types  of  special  arguments discussed below, the arguments

     other   than   the   command   name   are   passed   without

     interpretation to the invoked command.



     If the first argument is the name of an executable file,  it

     is invoked; otherwise the string `/bin/' is prepended to the

     argument.  (In this way most standard commands, which reside

     in  `/bin',  are  found.)   If no such command is found, the

     string   `/usr'    is    further    prepended    (to    give

     `/usr/bin/command')  and  another attempt is made to execute

     the resulting file.  (Certain lesser-used commands  live  in

     `/usr/bin'.)   If  the  `/usr/bin'  file  exists, but is not

     executable, it is used by the Shell as a command file.  That

     is  to  say  it is executed as though it were typed from the

     console.  If all attempts fail, a diagnostic is printed.



     Command lines.  One or more commands separated by `|' or `^'

     constitute  a pipeline.  The standard output of each command

     but the last in a pipeline is taken as the standard input of

     the  next  command.   Each  command  is  run  as  a separate

     process, connected by pipes (see pipe(II)) to its neighbors.

     A  command line contained in parentheses `( )' may appear in

     place of a simple command as an element of a pipeline.



     A command line consists of one or more pipelines  separated,

     and  perhaps  terminated  by  `;'  or  `&'.   The  semicolon

     designates sequential execution.  The ampersand  causes  the

     preceding  pipeline to be executed without waiting for it to

     finish.  The process id of such a pipeline is  reported,  so

     that  it  may  be used if necessary for a subsequent wait or

     kill.



     Termination Reporting.  If a command (not followed  by  `&')

     terminates   abnormally,   a   message   is  printed.   (All

     terminations other than exit and  interrupt  are  considered

     abnormal.)  Termination reports for commands followed by `&'

     are given upon receipt of the first  command  subsequent  to

     the  termination of the command, or when a wait is executed.

     The  following  is  a  list  of  the  abnormal   termination

     messages:



             Bus error

             Trace/BPT trap

             Illegal instruction

             IOT trap

             EMT trap

             Bad system call

             Quit

             Floating exception

             Memory violation

             Killed



     If a core image is produced, `- Core dumped' is appended  to

     the appropriate message.



     Redirection of I/O.  There  are  three  character  sequences

     that   cause   the   immediately   following  string  to  be

     interpreted as a special argument to the Shell itself.  Such

     an  argument  may  appear  anywhere among the arguments of a

     simple command, or before or after a  parenthesized  command

     list, and is associated with that command or command list.



     An argument of the form `<arg' causes the file `arg'  to  be

     used as the standard input file of the associated command.



     An argument of the form `>arg' causes file `arg' to be  used

     as  the  standard  output  file  for the associated command.

     `Arg' is created if it did not exist, and  in  any  case  is

     truncated at the outset.



     An argument of the form `>>arg' causes file `arg' to be used

     as the standard output for the associated command.  If `arg'

     did not exist, it is created; if it did exist,  the  command

     output is appended to the file.



     For example, either of the command lines



             ls >junk; cat tail >>junk

             ( ls; cat tail ) >junk



     creates, on file `junk', a listing of the working directory,

     followed immediately by the contents of file `tail'.



     Either of the constructs `>arg' or `>>arg'  associated  with

     any but the last command of a pipeline is ineffectual, as is

     `<arg' in any but the first.



     Generation of argument lists.  If any argument contains  any

     of  the  characters `?', `*' or `[', it is treated specially

     as follows.  The current directory  is  searched  for  files

     which match the given argument.



     The character `*' in an argument matches any string of char-

     acters in a file name (including the null string).



     The character `?' matches any single  character  in  a  file

     name.



     Square brackets `[...]' specify a class of characters  which

     matches any single file-name character in the class.  Within

     the brackets, each ordinary  character  is  taken  to  be  a

     member  of the class.  A pair of characters separated by `-'

     places in the class each character lexically greater than or

     equal  to  the  first  and  less than or equal to the second

     member of the pair.



     Other characters match only the same character in  the  file

     name.



     For example, `*' matches all file  names;  `?'  matches  all

     one-character  file  names; `[ab]*.s' matches all file names

     beginning with `a' or `b' and ending  with  `.s';  `?[zi-m]'

     matches  all two-character file names ending with `z' or the

     letters `i' through `m'.



     If the argument with `*' or  `?'  also  contains  a  `/',  a

     slightly  different  procedure  is  used:   instead  of  the

     current directory, the directory used is the one obtained by

     taking  the argument up to the last `/' before a `*' or `?'.

     The matching process matches the remainder of  the  argument

     after  this `/'  against the files in the derived directory.

     For example: `/usr/dmr/a*.s' matches all files in  directory

     `/usr/dmr' which begin with `a' and end with `.s'.



     In any event, a list of names is obtained  which  match  the

     argument.   This list is sorted into alphabetical order, and

     the resulting sequence  of  arguments  replaces  the  single

     argument  containing the `*', `[', or `?'.  The same process

     is carried out for each argument (the  resulting  lists  are

     not  merged)  and  finally  the  command  is called with the

     resulting list of arguments.



     For example: directory /usr/dmr  contains  the  files  a1.s,

     a2.s, ..., a9.s.  From any directory, the command



             as /usr/dmr/a?.s



     calls as with arguments  /usr/dmr/a1.s,  /usr/dmr/a2.s,  ...

     /usr/dmr/a9.s in that order.



     Quoting.  The character `\' causes the immediately following

     character  to  lose  any  special meaning it may have to the

     Shell;   in  this  way  `<',  `>',  and   other   characters

     meaningful  to the Shell may be passed as part of arguments.

     A special case of this feature allows  the  continuation  of

     commands  onto  more  than one line:  a new-line preceded by

     `\' is translated into a blank.



     Sequences of characters enclosed in double (") or single (')

     quotes are also taken literally.  For example:



             ls | pr -h "My directory"



     causes a directory listing to be produced by ls, and  passed

     on  to  pr  to  be  printed with the heading `My directory'.

     Quotes permit the inclusion of blanks in the heading,  which

     is a single argument to pr.



     Argument passing.  When the Shell is invoked as  a  command,

     it  has  additional  string processing capabilities.  Recall

     that the form in which the Shell is invoked is



             sh [ name [ arg1 ... [ arg9 ] ] ]



     The name is the name of  a  file  which  will  be  read  and

     interpreted.   If  not  given, this subinstance of the Shell

     will continue to read the standard input file.



     In command  lines  in  the  file  (not  in  command  input),

     character  sequences  of  the form `$n', where n is a digit,

     are replaced by the nth argument to the  invocation  of  the

     Shell (argn).  `$0' is replaced by name.



     End of file.  An end-of-file in the Shell's input causes  it

     to  exit.   A side effect of this fact means that the way to

     log out from UNIX is to type an EOT.



     Special  commands.   The  following  commands  are   treated

     specially by the Shell.



     chdir is done without spawning a new  process  by  executing

     sys chdir (II).



     login is done by executing /bin/login without creating a new

     process.



     wait is done without spawning a new process by executing sys

     wait (II).



     shift is done by manipulating the arguments to the Shell.



     `:' is simply ignored.



     Command file errors; interrupts.  Any Shell-detected  error,

     or  an  interrupt  signal, during the execution of a command

     file causes the Shell to cease execution of that file.



     Process that are created with a `&' ignore interrupts.  Also

     if  such  a process has not redirected its input with a `<',

     its input is automatically redirected  to  the  zero  length

     file /dev/null.



FILES

     /etc/glob, which interprets `*', `?', and `['.

     /dev/null as a source of end-of-file.



SEE ALSO

     `The UNIX Time-sharing System', which gives  the  theory  of

     operation of the Shell.

     chdir(I), login(I), wait(I), shift(I)



BUGS

     When  output  is  redirected,   particularly   to   make   a

     multicommand  pipeline, diagnostics tend to be sent down the

     pipe and are sometimes lost altogether.  Not all  components

     of a pipeline swawned with `&' ignore interrupts.