3/15/72                                                    SH (I)

NAME            sh  --  shell (command interpreter)

SYNOPSIS        sh [ name [ arg  ... [ arg  ] ] ]
                               1          9

DESCRIPTION     sh is the standard command interpreter.  It is

                the program which reads and arranges the execu-

                tion of the command lines typed by most users.

                It may itself be called as a command to interpret

                files of commands.  Before discussing the argu-

                ments to the shell used as a command, the struc-

                ture of command lines themselves will be given.

                Command lines

                Command lines are sequences of commands separated

                by command delimiters.  Each command is a se-

                quence 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 simply

                passed to the invoked command.

                If the first argument is the name of an exe-

                cutable 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 the "/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.

                The remaining non-special arguments are simply

                passed to the command without further interpreta-

                tion by the shell.

                Command delimiters

                There are three command delimiters:  the new-

                line, ";", and "&".  The semicolon ";" specifies

                sequential execution of the commands so sepa-

                rated; that is,

                        coma; comb

                causes the execution first of command coma, then

                of comb.  The ampersand "&" causes simultaneous


                        coma & comb

                causes coma to be called, followed immediately by

                comb without waiting for coma to finish.  Thus

                coma and comb execute simultaneously.  As a spe-

                cial case,

                        coma &

                causes coma to be executed and the shell immedi-

                ately to request another command without waiting

                for coma.

                Termination Reporting

                If a command (not followed by "&") terminates ab-

                normally, a message is printed.  (All termina-

                tions other than exit and interrupt are consid-

                ered abnormal.)  The following is a list of the

                abnormal termination messages:

                        Bus error

                        Trace trap

                        Illegal instruction

                        IOT trap

                        Power fail trap

                        EMT trap

                        Bad system call



                If a core image is produced, " -- Core dumped" is

                appended to the appropriate message.

                Redirection of I/O

                Three character sequences cause the immediately

                following string to be interpreted as a special

                argument to the shell itself, not passed to the


                An argument of the form "<arg" causes the file

                arg to be used as the standard input file of the

                given command.

                An argument of the form ">arg" causes file "arg"

                to be used as the standard output file for the

                given command.  "Arg" is created if it did not

                exist, and in any case is truncated at the out-


                An argument of the form ">>arg" causes file "arg"

                to be used as the standard output for the given

                command.  If "arg" did not exist, it is created;

                if it did exist, the command output is appended

                to the file.

                Generation of argument lists

                If any argument contains any of the characters

                "?", "*" or '[', it is treated specially as fol-

                lows.  The current directory is searched for

                files which match the given argument.

                The character "*" in an argument matches any

                string of characters in a file name (including

                the null string).

                The character "?" matches any single character in

                a file name.

                Each "[" must be paired with a matching "]".  The

                characters between "[" and "]" specify a class of

                characters.  It matches any single character in a

                file name which is in the class.  An ordinary

                character in the brackets specifies that charac-

                ter to be in the class.  A pair of characters

                separated by "-" specifies each character lexi-

                cally greater than or equal to the first and less

                than or equal to the second member of the pair is

                to be included in the class.  If the first member

                of the pair lexically exceeds the second, the

                second member is the sole character specified.

                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 let-

                ters "i" through "m".

                If the argument with "*" or "?" also contains a

                "/", a slightly different procedure is used:  in-

                stead 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 ar-

                gument 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 al-

                phabetical order, and the resulting sequence of

                arguments replaces the single argument containing

                the "*", "[", or "?".  The same process is car-

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


                The character "\" causes the immediately follow-

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

                Argument passing

                When the shell is invoked as a command, it has

                additional string processing capabilities.  Re-

                call that the form in which the shell is invoked


                     sh [ name [ arg  ... [ arg  ] ] ]
                                    1          9

                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 the file, character sequences of the form

                "$n", where n is a digit 0, ..., 9, are replaced

                by the nth argument to the invocation of the

                shell (arg ).  "$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 end of


                Special commands

                Two commands are treated specially by the shell.

                "Chdir" is done without spawning a new process by

                executing the sys chdir primitive.

                "Login" is done by executing /bin/login without

                creating a new process.

                These peculiarities are inexorably imposed upon

                the shell by the basic structure of the UNIX pro-

                cess control system.  It is a rewarding exercise

                to work out why.

                Command file errors; interrupts

                Any shell-detected error in a file of commands

                causes the shell to cease execution of that file.

FILES           /etc/glob, which interprets "*", "?", and "[".

SEE ALSO        "The UNIX Time-sharing System", which gives the

                theory of operation of the shell.

DIAGNOSTICS     "Input not found", when a command file is speci-

                fied which cannot be read;

                "Arg count", if the number of arguments to the

                chdir pseudo-command is not exactly 1, or if "*",

                "?", or "[" is used inappropriately;

                "Bad directory", if the directory given in

                "chdir" cannot be switched to;

                "Try again", if no new process can be created to

                execute the specified command;

                ""' imbalance", if single or double quotes are

                not matched;

                "Input file", if an argument after "<" cannot be


                "Output file", if an argument after ">" or ">>"

                cannot be written (or created);

                "No command", if the specified command cannot be


                "No match", if no arguments are generated for a

                command which contains "*", "?", or "[".

                Termination messages described above.

BUGS            If any argument contains a quoted "*", "?", or

                "[", then all instances of these characters must

                be quoted.  This is because sh calls the glob

                routine whenever an unquoted "*", "?", or "[" is

                noticed; the fact that other instances of these

                characters occurred quoted is not noticed by


OWNER           dmr, ken