Annotation of 43BSDReno/share/doc/usd/03.shell/t3, revision 1.1

1.1     ! root        1: .\"    @(#)t3  6.1 (Berkeley) 5/22/86
        !             2: .\"
        !             3: .SH
        !             4: 3.0\ Keyword\ parameters
        !             5: .LP
        !             6: Shell variables may be given values
        !             7: by assignment
        !             8: or when a shell procedure is invoked.
        !             9: An argument to a shell procedure of the form
        !            10: \fIname=value\fP
        !            11: that precedes the command name
        !            12: causes \fIvalue\fP
        !            13: to be assigned to \fIname\fP
        !            14: before execution of the procedure begins.
        !            15: The value of \fIname\fP in the invoking
        !            16: shell is not affected.
        !            17: For example,
        !            18: .DS
        !            19:        user=fred\ command
        !            20: .DE
        !            21: will execute \fIcommand\fP with
        !            22: \fBuser\fP set to \fIfred\fP.
        !            23: The \fB\(mik\fR flag causes arguments of the form
        !            24: \fIname=value\fP to be interpreted in this way
        !            25: anywhere in the argument list.
        !            26: Such \fInames\fP are sometimes
        !            27: called keyword parameters.
        !            28: If any arguments remain they
        !            29: are available as positional
        !            30: parameters \fB$1, $2, \*(ZZ\|.\fP
        !            31: .LP
        !            32: The \fIset\fP command
        !            33: may also be used to set positional parameters
        !            34: from within a procedure.
        !            35: For example,
        !            36: .DS
        !            37:        set\ \(mi\ \*(ST
        !            38: .DE
        !            39: will set \fB$1\fP to the first file name
        !            40: in the current directory, \fB$2\fP to the next,
        !            41: and so on.
        !            42: Note that the first argument, \(mi, ensures correct treatment
        !            43: when the first file name begins with a \(mi\|.
        !            44: .LP
        !            45: .SH
        !            46: 3.1\ Parameter\ transmission
        !            47: .LP
        !            48: When a shell procedure is invoked both positional
        !            49: and keyword parameters may be supplied with the call.
        !            50: Keyword parameters are also made available implicitly
        !            51: to a shell procedure
        !            52: by specifying in advance that such parameters
        !            53: are to be exported.
        !            54: For example,
        !            55: .DS
        !            56:        export\ user\ box
        !            57: .DE
        !            58: marks the variables \fBuser\fP and \fBbox\fP
        !            59: for export.
        !            60: When a shell procedure is invoked
        !            61: copies are made of all exportable variables
        !            62: for use within the invoked procedure.
        !            63: Modification of such variables
        !            64: within the procedure does not
        !            65: affect the values in the invoking shell.
        !            66: It is generally true of
        !            67: a shell procedure
        !            68: that it
        !            69: may not modify the state
        !            70: of its caller without explicit
        !            71: request on the part of the caller.
        !            72: (Shared file descriptors are an
        !            73: exception to this rule.)
        !            74: .LP
        !            75: Names whose value is intended to remain
        !            76: constant may be declared \fIreadonly\|.\fP
        !            77: The form of this command is the same as that of the \fIexport\fP
        !            78: command,
        !            79: .DS
        !            80:        readonly name \*(ZZ
        !            81: .DE
        !            82: Subsequent attempts to set readonly variables
        !            83: are illegal.
        !            84: .SH
        !            85: 3.2\ Parameter\ substitution
        !            86: .LP
        !            87: If a shell parameter is not set
        !            88: then the null string is substituted for it.
        !            89: For example, if the variable \fBd\fP
        !            90: is not set
        !            91: .DS
        !            92:        echo $d
        !            93: .DE
        !            94: or
        !            95: .DS
        !            96:        echo ${d}
        !            97: .DE
        !            98: will echo nothing.
        !            99: A default string may be given
        !           100: as in
        !           101: .DS
        !           102:        echo ${d\(mi\fB.\fR}
        !           103: .DE
        !           104: which will echo
        !           105: the value of the variable \fBd\fP
        !           106: if it is set and `\fB.\fP' otherwise.
        !           107: The default string is evaluated using the usual
        !           108: quoting conventions so that
        !           109: .DS
        !           110:        echo ${d\(mi\'\*(ST\'}
        !           111: .DE
        !           112: will echo \fB\*(ST\fP if the variable \fBd\fP
        !           113: is not set.
        !           114: Similarly
        !           115: .DS
        !           116:        echo ${d\(mi$1}
        !           117: .DE
        !           118: will echo the value of \fBd\fP if it is set
        !           119: and the value (if any) of \fB$1\fP otherwise.
        !           120: A variable may be assigned a default value
        !           121: using
        !           122: the notation
        !           123: .DS
        !           124:        echo ${d=\fB.\fR}
        !           125: .DE
        !           126: which substitutes the same string as
        !           127: .DS
        !           128:        echo ${d\(mi\fB.\fR}
        !           129: .DE
        !           130: and if \fBd\fP were not previously set
        !           131: then it will be set to the string `\fB.\fP'\|.
        !           132: (The notation ${\*(ZZ=\*(ZZ}
        !           133: is not available for positional parameters.)
        !           134: .LP
        !           135: If there is no sensible default then
        !           136: the notation
        !           137: .DS
        !           138:        echo ${d?message}
        !           139: .DE
        !           140: will echo the value of the variable \fBd\fP if it has
        !           141: one, otherwise \fImessage\fP is printed by the shell and
        !           142: execution of the shell procedure is abandoned.
        !           143: If \fImessage\fP is absent then a standard message
        !           144: is printed.
        !           145: A shell procedure that requires some parameters
        !           146: to be set might start as follows.
        !           147: .DS
        !           148:        :\ ${user?}\ ${acct?}\ ${bin?}
        !           149:        \*(ZZ
        !           150: .DE
        !           151: Colon (\fB:\fP) is a command
        !           152: that is
        !           153: built in to the shell and does nothing
        !           154: once its arguments have been evaluated.
        !           155: If any of the variables \fBuser, acct\fP
        !           156: or \fBbin\fP are not set then the shell
        !           157: will abandon execution of the procedure.
        !           158: .SH
        !           159: 3.3\ Command\ substitution
        !           160: .LP
        !           161: The standard output from a command can be
        !           162: substituted in a similar way to parameters.
        !           163: The command \fIpwd\fP prints on its standard
        !           164: output the name of the current directory.
        !           165: For example, if the current directory is
        !           166: \fB/usr/fred/bin\fR
        !           167: then the command
        !           168: .DS
        !           169:        d=\`pwd\`
        !           170: .DE
        !           171: is equivalent to
        !           172: .DS
        !           173:        d=/usr/fred/bin
        !           174: .DE
        !           175: .LP
        !           176: The entire string between grave accents (\`\*(ZZ\`)
        !           177: is taken as the command
        !           178: to be executed
        !           179: and is replaced with the output from
        !           180: the command.
        !           181: The command is written using the usual
        !           182: quoting conventions
        !           183: except that a \fB\`\fR must be escaped using
        !           184: a \fB\\\|.\fR
        !           185: For example,
        !           186: .DS
        !           187:        ls \`echo "$1"\`
        !           188: .DE
        !           189: is equivalent to
        !           190: .DS
        !           191:        ls $1
        !           192: .DE
        !           193: Command substitution occurs in all contexts
        !           194: where parameter substitution occurs (including \fIhere\fP documents) and the
        !           195: treatment of the resulting text is the same
        !           196: in both cases.
        !           197: This mechanism allows string
        !           198: processing commands to be used within
        !           199: shell procedures.
        !           200: An example of such a command is \fIbasename\fP
        !           201: which removes a specified suffix from a string.
        !           202: For example,
        !           203: .DS
        !           204:        basename main\fB.\fPc \fB.\fPc
        !           205: .DE
        !           206: will print the string \fImain\|.\fP
        !           207: Its use is illustrated by the following
        !           208: fragment from a \fIcc\fP command.
        !           209: .DS
        !           210:        case $A in
        !           211:        \*(Ca\*(ZZ
        !           212:        \*(Ca\*(ST\fB.\fPc)     B=\`basename $A \fB.\fPc\`
        !           213:        \*(Ca\*(ZZ
        !           214:        esac
        !           215: .DE
        !           216: that sets \fBB\fP to the part of \fB$A\fP
        !           217: with the suffix \fB.c\fP stripped.
        !           218: .LP
        !           219: Here are some composite examples.
        !           220: .RS
        !           221: .IP \(bu
        !           222: .ft B
        !           223: for i in \`ls \(mit\`; do \*(ZZ
        !           224: .ft R
        !           225: .br
        !           226: The variable \fBi\fP is set
        !           227: to the names of files in time order,
        !           228: most recent first.
        !           229: .IP \(bu
        !           230: .ft B
        !           231: set \`date\`; echo $6 $2 $3, $4
        !           232: .ft R
        !           233: .br
        !           234: will print, e.g.,
        !           235: .ft I
        !           236: 1977 Nov 1, 23:59:59
        !           237: .ft R
        !           238: .RE
        !           239: .SH
        !           240: 3.4\ Evaluation\ and\ quoting
        !           241: .LP
        !           242: The shell is a macro processor that
        !           243: provides parameter substitution, command substitution and file
        !           244: name generation for the arguments to commands.
        !           245: This section discusses the order in which
        !           246: these evaluations occur and the
        !           247: effects of the various quoting mechanisms.
        !           248: .LP
        !           249: Commands are parsed initially according to the grammar
        !           250: given in appendix A.
        !           251: Before a command is executed
        !           252: the following
        !           253: substitutions occur.
        !           254: .RS
        !           255: .IP \(bu
        !           256: parameter substitution, e.g. \fB$user\fP
        !           257: .IP \(bu
        !           258: command substitution, e.g. \fB\`pwd\`\fP
        !           259: .RS
        !           260: .LP
        !           261: Only one evaluation occurs so that if, for example, the value of the variable
        !           262: \fBX\fP
        !           263: is the string \fI$y\fP
        !           264: then
        !           265: .DS
        !           266:        echo $X
        !           267: .DE
        !           268: will echo \fI$y\|.\fP
        !           269: .RE
        !           270: .IP \(bu
        !           271: blank interpretation
        !           272: .RS
        !           273: .LP
        !           274: Following the above substitutions
        !           275: the resulting characters
        !           276: are broken into non-blank words (\fIblank interpretation\fP).
        !           277: For this purpose `blanks' are the characters of the string
        !           278: \fB$\s-1IFS\s0\fP.
        !           279: By default, this string consists of blank, tab and newline.
        !           280: The null string
        !           281: is not regarded as a word unless it is quoted.
        !           282: For example,
        !           283: .DS
        !           284:        echo \'\'
        !           285: .DE
        !           286: will pass on the null string as the first argument to \fIecho\fP,
        !           287: whereas
        !           288: .DS
        !           289:        echo $null
        !           290: .DE
        !           291: will call \fIecho\fR with no arguments
        !           292: if the variable \fBnull\fP is not set
        !           293: or set to the null string.
        !           294: .RE
        !           295: .IP \(bu
        !           296: file name generation
        !           297: .RS
        !           298: .LP
        !           299: Each word
        !           300: is then scanned for the file pattern characters
        !           301: \fB\*(ST, ?\fR and \fB[\*(ZZ]\fR
        !           302: and an alphabetical list of file names
        !           303: is generated to replace the word.
        !           304: Each such file name is a separate argument.
        !           305: .RE
        !           306: .RE
        !           307: .LP
        !           308: The evaluations just described also occur
        !           309: in the list of words associated with a \fBfor\fP
        !           310: loop.
        !           311: Only substitution occurs
        !           312: in the \fIword\fP used
        !           313: for a \fBcase\fP branch.
        !           314: .LP
        !           315: As well as the quoting mechanisms described
        !           316: earlier using \fB\\\fR and \fB\'\*(ZZ\'\fR
        !           317: a third quoting mechanism is provided using double quotes.
        !           318: Within double quotes parameter and command substitution
        !           319: occurs but file name generation and the interpretation
        !           320: of blanks does not.
        !           321: The following characters
        !           322: have a special meaning within double quotes
        !           323: and may be quoted using \fB\\\|.\fP
        !           324: .DS
        !           325:        \fB$    \fPparameter substitution
        !           326:        \fB\`\fP        command substitution
        !           327:        \fB"\fP ends the quoted string
        !           328:        \fB\e\fP        quotes the special characters \fB$ \` " \e\fP
        !           329: .DE
        !           330: For example,
        !           331: .DS
        !           332:        echo "$x"
        !           333: .DE
        !           334: will pass the value of the variable \fBx\fP as a
        !           335: single argument to \fIecho.\fP
        !           336: Similarly,
        !           337: .DS
        !           338:        echo "$\*(ST"
        !           339: .DE
        !           340: will pass the positional parameters as a single
        !           341: argument and is equivalent to
        !           342: .DS
        !           343:        echo "$1 $2 \*(ZZ"
        !           344: .DE
        !           345: The notation \fB$@\fP
        !           346: is the same as \fB$\*(ST\fR
        !           347: except when it is quoted.
        !           348: .DS
        !           349:        echo "$@"
        !           350: .DE
        !           351: will pass the positional parameters, unevaluated, to \fIecho\fR
        !           352: and is equivalent to
        !           353: .DS
        !           354:        echo "$1" "$2" \*(ZZ
        !           355: .DE
        !           356: .LP
        !           357: The following table gives, for each quoting mechanism,
        !           358: the shell metacharacters that are evaluated.
        !           359: .DS
        !           360: .ce
        !           361: .ft I
        !           362: metacharacter
        !           363: .ft
        !           364: .in 1.5i
        !           365:        \e      $       *       \`      "       \'
        !           366: \'     n       n       n       n       n       t
        !           367: \`     y       n       n       t       n       n
        !           368: "      y       y       n       y       t       n
        !           369: 
        !           370:        t       terminator
        !           371:        y       interpreted
        !           372:        n       not interpreted
        !           373: 
        !           374: .in
        !           375: .ft B
        !           376: .ce
        !           377: Figure 2. Quoting mechanisms
        !           378: .ft
        !           379: .DE
        !           380: .LP
        !           381: In cases where more than one evaluation of a string
        !           382: is required the built-in command \fIeval\fP
        !           383: may be used.
        !           384: For example,
        !           385: if the variable \fBX\fP has the value
        !           386: \fI$y\fP, and if \fBy\fP has the value \fIpqr\fP
        !           387: then
        !           388: .DS
        !           389:        eval echo $X
        !           390: .DE
        !           391: will echo the string \fIpqr\|.\fP
        !           392: .LP
        !           393: In general the \fIeval\fP command
        !           394: evaluates its arguments (as do all commands)
        !           395: and treats the result as input to the shell.
        !           396: The input is read and the resulting command(s)
        !           397: executed.
        !           398: For example,
        !           399: .DS
        !           400:        wg=\\'eval who\*(VTgrep\\'
        !           401:        $wg fred
        !           402: .DE
        !           403: is equivalent to
        !           404: .DS
        !           405:        who\*(VTgrep fred
        !           406: .DE
        !           407: In this example,
        !           408: \fIeval\fP is required
        !           409: since there is no interpretation
        !           410: of metacharacters, such as \fB\*(VT\|,\fP following
        !           411: substitution.
        !           412: .SH
        !           413: 3.5\ Error\ handling
        !           414: .LP
        !           415: The treatment of errors detected by
        !           416: the shell depends on the type of error
        !           417: and on whether the shell is being
        !           418: used interactively.
        !           419: An interactive shell is one whose
        !           420: input and output are connected
        !           421: to a terminal (as determined by
        !           422: \fIgtty\fP (2)).
        !           423: A shell invoked with the \fB\(mii\fP
        !           424: flag is also interactive.
        !           425: .LP
        !           426: Execution of a command (see also 3.7) may fail
        !           427: for any of the following reasons.
        !           428: .IP \(bu
        !           429: Input output redirection may fail.
        !           430: For example, if a file does not exist
        !           431: or cannot be created.
        !           432: .IP \(bu
        !           433: The command itself does not exist
        !           434: or cannot be executed.
        !           435: .IP \(bu
        !           436: The command terminates abnormally,
        !           437: for example, with a "bus error"
        !           438: or "memory fault".
        !           439: See Figure 2 below for a complete list
        !           440: of UNIX signals.
        !           441: .IP \(bu
        !           442: The command terminates normally
        !           443: but returns a non-zero exit status.
        !           444: .LP
        !           445: In all of these cases the shell
        !           446: will go on to execute the next command.
        !           447: Except for the last case an error
        !           448: message will be printed by the shell.
        !           449: All remaining errors cause the shell
        !           450: to exit from a command procedure.
        !           451: An interactive shell will return
        !           452: to read another command from the terminal.
        !           453: Such errors include the following.
        !           454: .IP \(bu
        !           455: Syntax errors.
        !           456: e.g., if \*(ZZ then \*(ZZ done
        !           457: .IP \(bu
        !           458: A signal such as interrupt.
        !           459: The shell waits for the current
        !           460: command, if any, to finish execution and
        !           461: then either exits or returns to the terminal.
        !           462: .IP \(bu
        !           463: Failure of any of the built-in commands
        !           464: such as \fIcd.\fP
        !           465: .LP
        !           466: The shell flag \fB\(mie\fP
        !           467: causes the shell to terminate
        !           468: if any error is detected.
        !           469: .DS
        !           470: 1      hangup
        !           471: 2      interrupt
        !           472: 3*     quit
        !           473: 4*     illegal instruction
        !           474: 5*     trace trap
        !           475: 6*     IOT instruction
        !           476: 7*     EMT instruction
        !           477: 8*     floating point exception
        !           478: 9      kill (cannot be caught or ignored)
        !           479: 10*    bus error
        !           480: 11*    segmentation violation
        !           481: 12*    bad argument to system call
        !           482: 13     write on a pipe with no one to read it
        !           483: 14     alarm clock
        !           484: 15     software termination (from \fIkill\fP (1))
        !           485: 
        !           486: .DE
        !           487: .ft B
        !           488: .ce
        !           489: Figure 3. UNIX signals\(dg
        !           490: .ft
        !           491: .FS
        !           492: \(dg Additional signals have been added in Berkeley Unix.  See sigvec(2) or signal(3C)
        !           493: for an up-to-date list.
        !           494: .FE
        !           495: Those signals marked with an asterisk
        !           496: produce a core dump
        !           497: if not caught.
        !           498: However,
        !           499: the shell itself ignores quit which is the only
        !           500: external signal that can cause a dump.
        !           501: The signals in this list of potential interest
        !           502: to shell programs are 1, 2, 3, 14 and 15.
        !           503: .SH
        !           504: 3.6\ Fault\ handling
        !           505: .LP
        !           506: Shell procedures normally terminate
        !           507: when an interrupt is received from the
        !           508: terminal.
        !           509: The \fItrap\fP command is used
        !           510: if some cleaning up is required, such
        !           511: as removing temporary files.
        !           512: For example,
        !           513: .DS
        !           514:        trap\ \'rm\ /tmp/ps$$; exit\'\ 2
        !           515: .DE
        !           516: sets a trap for signal 2 (terminal
        !           517: interrupt), and if this signal is received
        !           518: will execute the commands
        !           519: .DS
        !           520:        rm /tmp/ps$$; exit
        !           521: .DE
        !           522: \fIexit\fP is
        !           523: another built-in command
        !           524: that terminates execution of a shell procedure.
        !           525: The \fIexit\fP is required; otherwise,
        !           526: after the trap has been taken,
        !           527: the shell will resume executing
        !           528: the procedure
        !           529: at the place where it was interrupted.
        !           530: .LP
        !           531: UNIX signals can be handled in one of three ways.
        !           532: They can be ignored, in which case
        !           533: the signal is never sent to the process.
        !           534: They can be caught, in which case the process
        !           535: must decide what action to take when the
        !           536: signal is received.
        !           537: Lastly, they can be left to cause
        !           538: termination of the process without
        !           539: it having to take any further action.
        !           540: If a signal is being ignored
        !           541: on entry to the shell procedure, for example,
        !           542: by invoking it in the background (see 3.7) then \fItrap\fP
        !           543: commands (and the signal) are ignored.
        !           544: .LP
        !           545: The use of \fItrap\fP is illustrated
        !           546: by this modified version of the \fItouch\fP
        !           547: command (Figure 4).
        !           548: The cleanup action is to remove the file \fBjunk$$\fR\|.
        !           549: .DS
        !           550:        flag=
        !           551:        trap\ \'rm\ \(mif\ junk$$;\ exit\'\ 1 2 3 15
        !           552:        for i
        !           553:        do\ case\ $i\ in
        !           554:        \*(DC\(mic)     flag=N ;;
        !           555:        \*(DC\*(ST)     if\ test\ \(mif\ $i
        !           556:        \*(DC   then    ln\ $i\ junk$$;\ rm\ junk$$
        !           557:        \*(DC   elif\ test\ $flag
        !           558:        \*(DC   then    echo\ file\ \\\\\'$i\\\\\'\ does\ not\ exist
        !           559:        \*(DC   else    >$i
        !           560:        \*(DC   fi
        !           561:        \*(DOesac
        !           562:        done
        !           563: .DE
        !           564: .sp
        !           565: .ft B
        !           566: .ce
        !           567: Figure 4. The touch command
        !           568: .ft
        !           569: .sp
        !           570: The \fItrap\fP command
        !           571: appears before the creation
        !           572: of the temporary file;
        !           573: otherwise it would be
        !           574: possible for the process
        !           575: to die without removing
        !           576: the file.
        !           577: .LP
        !           578: Since there is no signal 0 in UNIX
        !           579: it is used by the shell to indicate the
        !           580: commands to be executed on exit from the
        !           581: shell procedure.
        !           582: .LP
        !           583: A procedure may, itself, elect to
        !           584: ignore signals by specifying the null
        !           585: string as the argument to trap.
        !           586: The following fragment is taken from the
        !           587: \fInohup\fP command.
        !           588: .DS
        !           589:        trap \'\' 1 2 3 15
        !           590: .DE
        !           591: which causes \fIhangup, interrupt, quit \fRand\fI kill\fR
        !           592: to be ignored both by the
        !           593: procedure and by invoked commands.
        !           594: .LP
        !           595: Traps may be reset by saying
        !           596: .DS
        !           597:        trap 2 3
        !           598: .DE
        !           599: which resets the traps for signals 2 and 3 to their default values.
        !           600: A list of the current values of traps may be obtained
        !           601: by writing
        !           602: .DS
        !           603:        trap
        !           604: .DE
        !           605: .LP
        !           606: The procedure \fIscan\fP (Figure 5) is an example
        !           607: of the use of \fItrap\fP where there is no exit
        !           608: in the trap command.
        !           609: \fIscan\fP takes each directory
        !           610: in the current directory, prompts
        !           611: with its name, and then executes
        !           612: commands typed at the terminal
        !           613: until an end of file or an interrupt is received.
        !           614: Interrupts are ignored while executing
        !           615: the requested commands but cause
        !           616: termination when \fIscan\fP is
        !           617: waiting for input.
        !           618: .DS
        !           619:        d=\`pwd\`
        !           620:        for\ i\ in\ \*(ST
        !           621:        do\ if\ test\ \(mid\ $d/$i
        !           622:        \*(DOthen\ cd\ $d/$i
        !           623:        \*(DO\*(THwhile\ echo\ "$i:"
        !           624:        \*(DO\*(TH\*(WHtrap\ exit\ 2
        !           625:        \*(DO\*(TH\*(WHread\ x
        !           626:        \*(DO\*(THdo\ trap\ :\ 2;\ eval\ $x;\ done
        !           627:        \*(DOfi
        !           628:        done
        !           629: .DE
        !           630: .sp
        !           631: .ft B
        !           632: .ce
        !           633: Figure 5. The scan command
        !           634: .ft
        !           635: .sp
        !           636: \fIread x\fR is a built-in command that reads one line from the
        !           637: standard input
        !           638: and places the result in the variable \fBx\|.\fP
        !           639: It returns a non-zero exit status if either
        !           640: an end-of-file is read or an interrupt
        !           641: is received.
        !           642: .SH
        !           643: 3.7\ Command\ execution
        !           644: .LP
        !           645: To run a command (other than a built-in) the shell first creates
        !           646: a new process using the system call \fIfork.\fP
        !           647: The execution environment for the command
        !           648: includes input, output and the states of signals, and
        !           649: is established in the child process
        !           650: before the command is executed.
        !           651: The built-in command \fIexec\fP
        !           652: is used in the rare cases when no fork
        !           653: is required
        !           654: and simply replaces the shell with a new command.
        !           655: For example, a simple version of the \fInohup\fP
        !           656: command looks like
        !           657: .DS
        !           658:        trap \\'\\' 1 2 3 15
        !           659:        exec $\*(ST
        !           660: .DE
        !           661: The \fItrap\fP turns off the signals specified
        !           662: so that they are ignored by subsequently created commands
        !           663: and \fIexec\fP replaces the shell by the command
        !           664: specified.
        !           665: .LP
        !           666: Most forms of input output redirection have already been
        !           667: described.
        !           668: In the following \fIword\fP is only subject
        !           669: to parameter and command substitution.
        !           670: No file name generation or blank interpretation
        !           671: takes place so that, for example,
        !           672: .DS
        !           673:                echo \*(ZZ >\*(ST.c
        !           674: .DE
        !           675: will write its output into a file whose name is \fB\*(ST.c\|.\fP
        !           676: Input output specifications are evaluated left to right
        !           677: as they appear in the command.
        !           678: .IP >\ \fIword\fP 12
        !           679: The standard output (file descriptor 1)
        !           680: is sent to the file \fIword\fP which is
        !           681: created if it does not already exist.
        !           682: .IP \*(AP\ \fIword\fP 12
        !           683: The standard output is sent to file \fIword.\fP
        !           684: If the file exists then output is appended
        !           685: (by seeking to the end);
        !           686: otherwise the file is created.
        !           687: .IP <\ \fIword\fP 12
        !           688: The standard input (file descriptor 0)
        !           689: is taken from the file \fIword.\fP
        !           690: .IP \*(HE\ \fIword\fP 12
        !           691: The standard input is taken from the lines
        !           692: of shell input that follow up to but not
        !           693: including a line consisting only of \fIword.\fP
        !           694: If \fIword\fP is quoted then no interpretation
        !           695: of the document occurs.
        !           696: If \fIword\fP is not quoted
        !           697: then parameter and command substitution
        !           698: occur and \fB\\\fP is used to quote
        !           699: the characters \fB\\\fP \fB$\fP \fB\`\fP and the first character
        !           700: of \fIword.\fP
        !           701: In the latter case \fB\\newline\fP is ignored (c.f. quoted strings).
        !           702: .IP >&\ \fIdigit\fP 12
        !           703: The file descriptor \fIdigit\fP is duplicated using the system
        !           704: call \fIdup\fP (2)
        !           705: and the result is used as the standard output.
        !           706: .IP <&\ \fIdigit\fP 12
        !           707: The standard input is duplicated from file descriptor \fIdigit.\fP
        !           708: .IP <&\(mi 12
        !           709: The standard input is closed.
        !           710: .IP >&\(mi 12
        !           711: The standard output is closed.
        !           712: .LP
        !           713: Any of the above may be preceded by a digit in which
        !           714: case the file descriptor created is that specified by the digit
        !           715: instead of the default 0 or 1.
        !           716: For example,
        !           717: .DS
        !           718:        \*(ZZ 2>file
        !           719: .DE
        !           720: runs a command with message output (file descriptor 2)
        !           721: directed to \fIfile.\fP
        !           722: .DS
        !           723:        \*(ZZ 2>&1
        !           724: .DE
        !           725: runs a command with its standard output and message output
        !           726: merged.
        !           727: (Strictly speaking file descriptor 2 is created
        !           728: by duplicating file descriptor 1 but the effect is usually to
        !           729: merge the two streams.)
        !           730: .LP
        !           731: The environment for a command run in the background such as
        !           732: .DS
        !           733:        list \*(ST.c \*(VT lpr &
        !           734: .DE
        !           735: is modified in two ways.
        !           736: Firstly, the default standard input
        !           737: for such a command is the empty file \fB/dev/null\|.\fR
        !           738: This prevents two processes (the shell and the command),
        !           739: which are running in parallel, from trying to
        !           740: read the same input.
        !           741: Chaos would ensue
        !           742: if this were not the case.
        !           743: For example,
        !           744: .DS
        !           745:        ed file &
        !           746: .DE
        !           747: would allow both the editor and the shell
        !           748: to read from the same input at the same time.
        !           749: .LP
        !           750: The other modification to the environment of a background
        !           751: command is to turn off the QUIT and INTERRUPT signals
        !           752: so that they are ignored by the command.
        !           753: This allows these signals to be used
        !           754: at the terminal without causing background
        !           755: commands to terminate.
        !           756: For this reason the UNIX convention
        !           757: for a signal is that if it is set to 1
        !           758: (ignored) then it is never changed
        !           759: even for a short time.
        !           760: Note that the shell command \fItrap\fP
        !           761: has no effect for an ignored signal.
        !           762: .SH
        !           763: 3.8\ Invoking\ the\ shell
        !           764: .LP
        !           765: The following flags are interpreted by the shell
        !           766: when it is invoked.
        !           767: If the first character of argument zero is a minus,
        !           768: then commands are read from the file \fB.profile\|.\fP
        !           769: .IP \fB\(mic\fP\ \fIstring\fP
        !           770: .br
        !           771: If the \fB\(mic\fP flag is present then
        !           772: commands are read from \fIstring\|.\fP
        !           773: .IP \fB\(mis\fP
        !           774: If the \fB\(mis\fP flag is present or if no
        !           775: arguments remain
        !           776: then commands are read from the standard input.
        !           777: Shell output is written to
        !           778: file descriptor 2.
        !           779: .IP \fB\(mii\fP
        !           780: If the \fB\(mii\fP flag is present or
        !           781: if the shell input and output are attached to a terminal (as told by \fIgtty\fP)
        !           782: then this shell is \fIinteractive.\fP
        !           783: In this case TERMINATE is ignored (so that \fBkill 0\fP
        !           784: does not kill an interactive shell) and INTERRUPT is caught and ignored
        !           785: (so that \fBwait\fP is interruptable).
        !           786: In all cases QUIT is ignored by the shell.
        !           787: .SH
        !           788: Acknowledgements
        !           789: .LP
        !           790: The design of the shell is
        !           791: based in part on the original UNIX shell
        !           792: .[
        !           793: unix command language thompson
        !           794: .]
        !           795: and the PWB/UNIX shell,
        !           796: .[
        !           797: pwb shell mashey unix
        !           798: .]
        !           799: some
        !           800: features having been taken from both.
        !           801: Similarities also exist with the
        !           802: command interpreters
        !           803: of the Cambridge Multiple Access System
        !           804: .[
        !           805: cambridge multiple access system hartley
        !           806: .]
        !           807: and of CTSS.
        !           808: .[
        !           809: ctss
        !           810: .]
        !           811: .LP
        !           812: I would like to thank Dennis Ritchie
        !           813: and John Mashey for many
        !           814: discussions during the design of the shell.
        !           815: I am also grateful to the members of the Computing Science Research Center
        !           816: and to Joe Maranzano for their
        !           817: comments on drafts of this document.
        !           818: .SH
        !           819: .[
        !           820: $LIST$
        !           821: .]

unix.superglobalmegacorp.com

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