|
|
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: .]
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.