Annotation of 43BSDReno/share/doc/ps2/01.cacm/p4, revision 1.1

1.1     ! root        1: .\"    @(#)p4  6.1 (Berkeley) 4/24/86
        !             2: .\"
        !             3: .SH
        !             4: VI. THE SHELL
        !             5: .PP
        !             6: For most users,
        !             7: communication with
        !             8: the system
        !             9: is carried on with the
        !            10: aid of a program called the \&shell.
        !            11: The \&shell is a
        !            12: command-line interpreter: it reads lines typed by the user and
        !            13: interprets them as requests to execute
        !            14: other programs.
        !            15: (The \&shell is described fully elsewhere,
        !            16: .[
        !            17: bourne shell bstj
        !            18: %Q This issue
        !            19: .]
        !            20: so this section will discuss only the theory of its operation.)
        !            21: In simplest form, a command line consists of the command
        !            22: name followed by arguments to the command, all separated
        !            23: by spaces:
        !            24: .P1
        !            25: command arg\*s\d1\u\*n arg\*s\d2\u\*n .\|.\|. arg\*s\dn\u\*n
        !            26: .P2
        !            27: The \&shell splits up the command name and the arguments into
        !            28: separate strings.
        !            29: Then a file with name
        !            30: .UL command
        !            31: is sought;
        !            32: .UL command
        !            33: may be a path name including the ``/'' character to
        !            34: specify any file in the system.
        !            35: If
        !            36: .UL command
        !            37: is found, it is brought into
        !            38: memory and executed.
        !            39: The arguments
        !            40: collected by the \&shell are accessible
        !            41: to the command.
        !            42: When the command is finished, the \&shell
        !            43: resumes its own execution, and indicates its readiness
        !            44: to accept another command by typing a prompt character.
        !            45: .PP
        !            46: If file
        !            47: .UL command
        !            48: cannot be found,
        !            49: the \&shell generally prefixes a string 
        !            50: such as
        !            51: .UL /\|bin\|/
        !            52: to
        !            53: .UL command
        !            54: and
        !            55: attempts again to find the file.
        !            56: Directory
        !            57: .UL /\|bin
        !            58: contains commands
        !            59: intended to be generally used.
        !            60: (The sequence of directories to be searched
        !            61: may be changed by user request.)
        !            62: .SH
        !            63: 6.1 Standard I/O
        !            64: .PP
        !            65: The discussion of I/O in Section III above seems to imply that
        !            66: every file used by a program must be opened or created by the program in
        !            67: order to get a file descriptor for the file.
        !            68: Programs executed by the \&shell, however, start off with
        !            69: three open files with file descriptors
        !            70: 0, 1, and 2.
        !            71: As such a program begins execution, file 1 is open for writing,
        !            72: and is best understood as the standard output file.
        !            73: Except under circumstances indicated below, this file
        !            74: is the user's terminal.
        !            75: Thus programs that wish to write informative
        !            76: information ordinarily use file descriptor 1.
        !            77: Conversely, file 0 starts off open for reading, and programs that
        !            78: wish to read messages typed by the user
        !            79: read this file.
        !            80: .PP
        !            81: The \&shell is able to change the standard assignments of
        !            82: these file descriptors from the
        !            83: user's terminal printer and keyboard.
        !            84: If one of the
        !            85: arguments to a command is prefixed by ``>'', file descriptor
        !            86: 1 will, for the duration of the command, refer to the
        !            87: file named after the ``>''.
        !            88: For example:
        !            89: .P1
        !            90: ls
        !            91: .P2
        !            92: ordinarily lists, on the typewriter, the names of the files in the current
        !            93: directory.
        !            94: The command:
        !            95: .P1
        !            96: ls >there
        !            97: .P2
        !            98: creates a file called
        !            99: .UL there
        !           100: and places the listing there.
        !           101: Thus the argument
        !           102: .UL >there
        !           103: means
        !           104: ``place output on
        !           105: .UL there .''
        !           106: On the other hand:
        !           107: .P1
        !           108: ed
        !           109: .P2
        !           110: ordinarily enters the editor, which takes requests from the
        !           111: user via his keyboard.
        !           112: The command
        !           113: .P1
        !           114: ed <script
        !           115: .P2
        !           116: interprets
        !           117: .UL script
        !           118: as a file of editor commands;
        !           119: thus
        !           120: .UL <script
        !           121: means ``take input from
        !           122: .UL script .''
        !           123: .PP
        !           124: Although the file name following ``<'' or ``>'' appears
        !           125: to be an argument to the command, in fact it is interpreted
        !           126: completely by the \&shell and is not passed to the
        !           127: command at all.
        !           128: Thus no special coding to handle I/O redirection is needed within each
        !           129: command; the command need merely use the standard file
        !           130: descriptors 0 and 1 where appropriate.
        !           131: .PP
        !           132: File descriptor 2 is, like file 1,
        !           133: ordinarily associated with the terminal output stream.
        !           134: When an output-diversion request with ``>'' is specified,
        !           135: file 2 remains attached to the terminal, so that commands
        !           136: may produce diagnostic messages that
        !           137: do not silently end up in the output file.
        !           138: .SH
        !           139: 6.2 Filters
        !           140: .PP
        !           141: An extension of the standard I/O notion is used
        !           142: to direct output from one command to
        !           143: the input of another.
        !           144: A sequence of commands separated by
        !           145: vertical bars causes the \&shell to
        !           146: execute all the commands simultaneously and to arrange
        !           147: that the standard output of each command
        !           148: be delivered to the standard input of
        !           149: the next command in the sequence.
        !           150: Thus in the command line:
        !           151: .P1
        !           152: ls | pr \(mi2 | opr
        !           153: .P2
        !           154: .UL ls
        !           155: lists the names of the files in the current directory;
        !           156: its output is passed to
        !           157: .UL pr ,
        !           158: which
        !           159: paginates its input with dated headings.
        !           160: (The argument ``\(mi2'' requests
        !           161: double-column output.)
        !           162: Likewise, the output from
        !           163: .UL pr
        !           164: is input to
        !           165: .UL opr ;
        !           166: this command spools its input onto a file for off-line
        !           167: printing.
        !           168: .PP
        !           169: This procedure could have been carried out
        !           170: more clumsily by:
        !           171: .P1
        !           172: ls >temp1
        !           173: pr \(mi2 <temp1 >temp2
        !           174: opr <temp2
        !           175: .P2
        !           176: followed by removal of the temporary files.
        !           177: In the absence of the ability
        !           178: to redirect output and input,
        !           179: a still clumsier method would have been to
        !           180: require the
        !           181: .UL ls
        !           182: command
        !           183: to accept user requests to paginate its output,
        !           184: to print in multi-column format, and to arrange
        !           185: that its output be delivered off-line.
        !           186: Actually it would be surprising, and in fact
        !           187: unwise for efficiency reasons,
        !           188: to expect authors of
        !           189: commands such as
        !           190: .UL ls
        !           191: to provide such a wide variety of output options.
        !           192: .PP
        !           193: A program
        !           194: such as
        !           195: .UL pr
        !           196: which copies its standard input to its standard output
        !           197: (with processing)
        !           198: is called a
        !           199: .IT filter .
        !           200: Some filters that we have found useful
        !           201: perform
        !           202: character transliteration,
        !           203: selection of lines according to a pattern,
        !           204: sorting of the input,
        !           205: and encryption and decryption.
        !           206: .SH
        !           207: 6.3 Command separators; multitasking
        !           208: .PP
        !           209: Another feature provided by the \&shell is relatively straightforward.
        !           210: Commands need not be on different lines; instead they may be separated
        !           211: by semicolons:
        !           212: .P1
        !           213: ls; ed
        !           214: .P2
        !           215: will first list the contents of the current directory, then enter
        !           216: the editor.
        !           217: .PP
        !           218: A related feature is more interesting.
        !           219: If a command is followed
        !           220: by ``\f3&\f1,'' the \&shell will not wait for the command to finish before
        !           221: prompting again; instead, it is ready immediately
        !           222: to accept a new command.
        !           223: For example:
        !           224: .bd 3
        !           225: .P1
        !           226: as source >output &
        !           227: .P2
        !           228: causes
        !           229: .UL source
        !           230: to be assembled, with diagnostic
        !           231: output going to
        !           232: .UL output ;
        !           233: no matter how long the
        !           234: assembly takes, the \&shell returns immediately.
        !           235: When the \&shell does not wait for
        !           236: the completion of a command,
        !           237: the identification number of the
        !           238: process running that command is printed.
        !           239: This identification may be used to
        !           240: wait for the completion of the command or to
        !           241: terminate it.
        !           242: The ``\f3&\f1'' may be used
        !           243: several times in a line:
        !           244: .P1
        !           245: as source >output & ls >files &
        !           246: .P2
        !           247: does both the assembly and the listing in the background.
        !           248: In these examples, an output file
        !           249: other than the terminal was provided; if this had not been
        !           250: done, the outputs of the various commands would have been
        !           251: intermingled.
        !           252: .PP
        !           253: The \&shell also allows parentheses in the above operations.
        !           254: For example:
        !           255: .P1
        !           256: (\|date; ls\|) >x &
        !           257: .P2
        !           258: writes the current date and time followed by
        !           259: a list of the current directory onto the file
        !           260: .UL x .
        !           261: The \&shell also returns immediately for another request.
        !           262: .SH 1
        !           263: 6.4 The \&shell as a command; command files
        !           264: .PP
        !           265: The \&shell is itself a command, and may be called recursively.
        !           266: Suppose file
        !           267: .UL tryout
        !           268: contains the lines:
        !           269: .P1
        !           270: as source
        !           271: mv a.out testprog
        !           272: testprog
        !           273: .P2
        !           274: The
        !           275: .UL mv
        !           276: command causes the file
        !           277: .UL a.out
        !           278: to be renamed
        !           279: .UL testprog.
        !           280: .UL \&a.out
        !           281: is the (binary) output of the assembler, ready to be executed.
        !           282: Thus if the three lines above were typed on the keyboard,
        !           283: .UL source
        !           284: would be assembled, the resulting program renamed
        !           285: .UL testprog ,
        !           286: and
        !           287: .UL testprog
        !           288: executed.
        !           289: When the lines are in
        !           290: .UL tryout ,
        !           291: the command:
        !           292: .P1
        !           293: sh <tryout
        !           294: .P2
        !           295: would cause the \&shell
        !           296: .UL sh
        !           297: to execute the commands
        !           298: sequentially.
        !           299: .PP
        !           300: The \&shell has further capabilities, including the
        !           301: ability to substitute parameters
        !           302: and
        !           303: to construct argument lists from a specified
        !           304: subset of the file names in a directory.
        !           305: It also provides general conditional and looping constructions.
        !           306: .SH 1
        !           307: 6.5 Implementation of the \&shell
        !           308: .PP
        !           309: The outline of the operation of the \&shell can now be understood.
        !           310: Most of the time, the \&shell
        !           311: is waiting for the user to type a command.
        !           312: When the
        !           313: newline character ending the line
        !           314: is typed, the \&shell's
        !           315: .UL read
        !           316: call returns.
        !           317: The \&shell analyzes the command line, putting the
        !           318: arguments in a form appropriate for
        !           319: .UL execute .
        !           320: Then
        !           321: .UL fork
        !           322: is called.
        !           323: The child process, whose code
        !           324: of course is still that of the \&shell, attempts
        !           325: to perform an
        !           326: .UL execute
        !           327: with the appropriate arguments.
        !           328: If successful, this will bring in and start execution of the program whose name
        !           329: was given.
        !           330: Meanwhile, the other process resulting from the
        !           331: .UL fork ,
        !           332: which is the
        !           333: parent process,
        !           334: .UL wait s
        !           335: for the child process to die.
        !           336: When this happens, the \&shell knows the command is finished, so
        !           337: it types its prompt and reads the keyboard to obtain another
        !           338: command.
        !           339: .PP
        !           340: Given this framework, the implementation of background processes
        !           341: is trivial; whenever a command line contains ``\f3&\f1,''
        !           342: the \&shell merely refrains from waiting for the process
        !           343: that it created
        !           344: to execute the command.
        !           345: .PP
        !           346: Happily, all of this mechanism meshes very nicely with
        !           347: the notion of standard input and output files.
        !           348: When a process is created by the
        !           349: .UL fork
        !           350: primitive, it
        !           351: inherits not only the memory image of its parent
        !           352: but also all the files currently open in its parent,
        !           353: including those with file descriptors 0, 1, and 2.
        !           354: The \&shell, of course, uses these files to read command
        !           355: lines and to write its prompts and diagnostics, and in the ordinary case
        !           356: its children\(emthe command programs\(eminherit them automatically.
        !           357: When an argument with ``<'' or ``>'' is given, however, the
        !           358: offspring process, just before it performs
        !           359: .UL execute,
        !           360: makes the standard I/O
        !           361: file descriptor (0 or 1, respectively) refer to the named file.
        !           362: This is easy
        !           363: because, by agreement,
        !           364: the smallest unused file descriptor is assigned
        !           365: when a new file is
        !           366: .UL open ed
        !           367: (or
        !           368: .UL create d);
        !           369: it is only necessary to close file 0 (or 1)
        !           370: and open the named file.
        !           371: Because the process in which the command program runs simply terminates
        !           372: when it is through, the association between a file
        !           373: specified after ``<'' or ``>'' and file descriptor 0 or 1 is ended
        !           374: automatically when the process dies.
        !           375: Therefore
        !           376: the \&shell need not know the actual names of the files
        !           377: that are its own standard input and output, because it need
        !           378: never reopen them.
        !           379: .PP
        !           380: Filters are straightforward extensions
        !           381: of standard I/O redirection with pipes used
        !           382: instead of files.
        !           383: .PP
        !           384: In ordinary circumstances, the main loop of the \&shell never
        !           385: terminates.
        !           386: (The main loop includes the
        !           387: branch of the return from
        !           388: .UL fork
        !           389: belonging to the
        !           390: parent process; that is, the branch that does a
        !           391: .UL wait ,
        !           392: then
        !           393: reads another command line.)
        !           394: The one thing that causes the \&shell to terminate is
        !           395: discovering an end-of-file condition on its input file.
        !           396: Thus, when the \&shell is executed as a command with
        !           397: a given input file, as in:
        !           398: .P1
        !           399: sh <comfile
        !           400: .P2
        !           401: the commands in
        !           402: .UL comfile
        !           403: will be executed until
        !           404: the end of
        !           405: .UL comfile
        !           406: is reached; then the instance of the \&shell
        !           407: invoked by
        !           408: .UL sh
        !           409: will terminate.
        !           410: Because this \&shell process
        !           411: is the child of another instance of the \&shell, the
        !           412: .UL wait
        !           413: executed in the latter will return, and another
        !           414: command may then be processed.
        !           415: .SH
        !           416: 6.6 Initialization
        !           417: .PP
        !           418: The instances of the \&shell to which users type
        !           419: commands are themselves children of another process.
        !           420: The last step in the initialization of
        !           421: the system
        !           422: is the creation of
        !           423: a single process and the invocation (via
        !           424: .UL execute )
        !           425: of a program called
        !           426: .UL init .
        !           427: The role of
        !           428: .UL init
        !           429: is to create one process
        !           430: for each terminal channel.
        !           431: The various subinstances of
        !           432: .UL init
        !           433: open the appropriate terminals
        !           434: for input and output
        !           435: on files 0, 1, and 2,
        !           436: waiting, if necessary, for carrier to be established on dial-up lines.
        !           437: Then a message is typed out requesting that the user log in.
        !           438: When the user types a name or other identification,
        !           439: the appropriate instance of
        !           440: .UL init
        !           441: wakes up, receives the log-in
        !           442: line, and reads a password file.
        !           443: If the user's name is found, and if
        !           444: he is able to supply the correct password,
        !           445: .UL init
        !           446: changes to the user's default current directory, sets
        !           447: the process's user \*sID\*n to that of the person logging in, and performs
        !           448: an
        !           449: .UL execute
        !           450: of the \&shell.
        !           451: At this point, the \&shell is ready to receive commands
        !           452: and the logging-in protocol is complete.
        !           453: .PP
        !           454: Meanwhile, the mainstream path of
        !           455: .UL init
        !           456: (the parent of all
        !           457: the subinstances of itself that will later become \&shells)
        !           458: does a
        !           459: .UL wait .
        !           460: If one of the child processes terminates, either
        !           461: because a \&shell found an end of file or because a user
        !           462: typed an incorrect name or password, this path of
        !           463: .UL init
        !           464: simply recreates the defunct process, which in turn reopens the appropriate
        !           465: input and output files and types another log-in message.
        !           466: Thus a user may log out simply by typing the end-of-file
        !           467: sequence to the \&shell.
        !           468: .SH
        !           469: 6.7 Other programs as \&shell
        !           470: .PP
        !           471: The \&shell as described above is designed to allow users
        !           472: full access to the facilities of the system, because it will
        !           473: invoke the execution of any program
        !           474: with appropriate protection mode.
        !           475: Sometimes, however, a different interface to the system
        !           476: is desirable, and this feature is easily arranged for.
        !           477: .PP
        !           478: Recall that after a user has successfully logged in by supplying
        !           479: a name and password,
        !           480: .UL init
        !           481: ordinarily invokes the \&shell
        !           482: to interpret command lines.
        !           483: The user's entry
        !           484: in the password file may contain the name
        !           485: of a program to be invoked after log-in instead of the \&shell.
        !           486: This program is free to interpret the user's messages
        !           487: in any way it wishes.
        !           488: .PP
        !           489: For example, the password file entries
        !           490: for users of a secretarial editing system
        !           491: might
        !           492: specify that the
        !           493: editor
        !           494: .UL ed
        !           495: is to be used instead of the \&shell.
        !           496: Thus when users of the editing system log in, they are inside the editor and
        !           497: can begin work immediately; also, they can be prevented from
        !           498: invoking
        !           499: programs not intended for their use.
        !           500: In practice, it has proved desirable to allow a temporary
        !           501: escape from the editor
        !           502: to execute the formatting program and other utilities.
        !           503: .PP
        !           504: Several of the games (e.g., chess, blackjack, 3D tic-tac-toe)
        !           505: available on
        !           506: the system
        !           507: illustrate
        !           508: a much more severely restricted environment.
        !           509: For each of these, an entry exists
        !           510: in the password file specifying that the appropriate game-playing
        !           511: program is to be invoked instead of the \&shell.
        !           512: People who log in as a player
        !           513: of one of these games find themselves limited to the
        !           514: game and unable to investigate the (presumably more interesting)
        !           515: offerings of
        !           516: the
        !           517: .UX
        !           518: system
        !           519: as a whole.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.