|
|
1.1 ! root 1: .ds OK [\| ! 2: .ds CK \|] ! 3: .TH RC 1 ! 4: .CT 1 shell proc_man dirs files ! 5: .SH NAME ! 6: rc, cd, wait, whatis \- command language ! 7: .SH SYNOPSIS ! 8: .B rc ! 9: [ ! 10: .B -dilxepv ! 11: ] ! 12: [ ! 13: .B -c command ! 14: ] ! 15: [ ! 16: .I file ! 17: [ ! 18: .I arg ... ! 19: ] ! 20: ] ! 21: .SH DESCRIPTION ! 22: .I Rc ! 23: is the Plan 9 shell. ! 24: It executes command lines read from a terminal or a file or, with the ! 25: .B -c ! 26: flag, from ! 27: .I rc's ! 28: argument list. ! 29: .SS Command Lines ! 30: A command line is a sequence of commands, separated by ampersands or semicolons ! 31: .RB ( & ! 32: or ! 33: .BR ; ) ! 34: and terminated by a newline. ! 35: The commands are executed in sequence ! 36: from left to right. ! 37: .I Rc ! 38: does not wait for a command followed by ! 39: .B & ! 40: to finish executing before starting ! 41: the following command. ! 42: Whenever a command followed by ! 43: .B & ! 44: is executed, its process id is assigned to the ! 45: .I rc ! 46: variable ! 47: .BR $apid . ! 48: Whenever a command ! 49: .I not ! 50: followed by ! 51: .B & ! 52: exits normally, the low 8 bits of the argument to its ! 53: .IR exit (2) ! 54: call ! 55: are assigned to the ! 56: .I rc ! 57: variable ! 58: .BR $status . ! 59: If it terminates abnormally, ! 60: .B $status ! 61: has value 1000 plus the termination status provided to wait(2). ! 62: .PP ! 63: A long command line may be continued on subsequent lines by typing ! 64: a backslash ! 65: .RB ( \e ) ! 66: followed by a newline. ! 67: This sequence is treated as though it were a blank. ! 68: Backslash is not otherwise a special character. ! 69: .PP ! 70: A number-sign ! 71: .RB ( # ) ! 72: and any following characters up to (but not including) the next newline ! 73: are ignored, except in quotation marks. ! 74: .SS Simple Commands ! 75: A simple command is a sequence of arguments interspersed with I/O redirections. ! 76: If the first argument is the name of an ! 77: .I rc ! 78: function or of one of ! 79: .I rc's ! 80: built-in commands, it is executed by ! 81: .I rc. ! 82: Otherwise if the name contains a slash ! 83: .RB ( / ), ! 84: it must be the pathname of the program to be executed. ! 85: Names containing no slash are searched for in ! 86: a list of directory names stored in ! 87: .BR $path . ! 88: The first executable file of the given name found ! 89: in a directory in ! 90: .B $path ! 91: is the program to be executed. ! 92: .PP ! 93: The first word of a simple command cannot be a keyword unless it is ! 94: quoted or otherwise disguised. ! 95: The keywords are ! 96: .EX ! 97: for in while if not switch fn ~ ! @ ! 98: .EE ! 99: .SS Arguments and Variables ! 100: A number of constructions may be used where ! 101: .I rc's ! 102: syntax requires an argument to appear. ! 103: In many cases a construction's ! 104: value will be a list of arguments rather than a single string. ! 105: .PP ! 106: The simplest kind of argument is the unquoted word: ! 107: a sequence of one or more characters none of which is a blank, tab, ! 108: newline or any of the following: ! 109: .EX ! 110: # ; & | ^ $ = ` ' { } ( ) < > ! 111: .EE ! 112: An unquoted word that contains any of the characters ! 113: .B * ? ! 114: or ! 115: .BR [ , ! 116: is a pattern for matching against file names. ! 117: The character ! 118: .B * ! 119: matches any sequence of characters, ! 120: .B ? ! 121: matches any single character and ! 122: .BI [ class ] ! 123: matches any character in the ! 124: .IR class . ! 125: If the first character of ! 126: .I class ! 127: is ! 128: .BR ~ , ! 129: the class is complemented. ! 130: The ! 131: .I class ! 132: may also contain pairs of characters separated by ! 133: .BR - , ! 134: standing for all characters lexically between the two. ! 135: The character ! 136: .B / ! 137: must appear explicitly in a pattern, as must the ! 138: first character of the pathname components ! 139: .B . ! 140: and ! 141: .BR .. . ! 142: A pattern is replaced by a list of arguments, one for each pathname matched, ! 143: except that a pattern matching no names is not replaced by the empty list, ! 144: but rather stands for itself. ! 145: Pattern matching is done after all other ! 146: operations. ! 147: Thus, ! 148: .EX ! 149: x=/tmp echo $x^/*.c ! 150: .EE ! 151: matches ! 152: .BR /tmp/*.c , ! 153: rather than matching ! 154: .B "/*.c ! 155: and then prepending ! 156: .BR /tmp . ! 157: .PP ! 158: A quoted word is a sequence of characters surrounded by single quotes ! 159: .RB ( ' ). ! 160: A single quote is represented in a quoted word by a pair of quotes ! 161: .RB ( '' ). ! 162: .PP ! 163: Each of the following is an argument. ! 164: .PD 0 ! 165: .HP ! 166: .BI ( arguments ) ! 167: .br ! 168: The value of a sequence of arguments enclosed in parentheses is ! 169: a list comprising the members of each element of the sequence. ! 170: Argument lists have no recursive structure, although their syntax may ! 171: suggest it. ! 172: The following are entirely equivalent: ! 173: .EX ! 174: echo hi there everybody ! 175: ((echo) (hi there) everybody) ! 176: .EE ! 177: .HP ! 178: .BI $ argument ! 179: .HP ! 180: .BI $ argument ( subscript ) ! 181: .br ! 182: The ! 183: .I argument ! 184: after the ! 185: .B $ ! 186: is the name of a variable whose value is substituted. ! 187: Multiple levels ! 188: of indirection are possible, but of questionable utility. ! 189: Variable values ! 190: are lists of strings. ! 191: If ! 192: .I argument ! 193: is a number ! 194: .IR n , ! 195: the value is the ! 196: .IR n th ! 197: element of ! 198: .BR $* , ! 199: unless ! 200: .B $* ! 201: doesn't have ! 202: .I n ! 203: elements, in which case the value is empty. ! 204: If ! 205: .I argument ! 206: is followed by a parenthesized list of subscripts, the ! 207: value substituted is a list composed of the requested elements (origin 1). ! 208: The parenthesis must follow the variable name with no spaces. ! 209: Assignments to variables are described below. ! 210: .HP ! 211: .BI $# argument ! 212: .br ! 213: The value is the number of elements in the named variable. ! 214: A variable ! 215: never assigned a value has zero elements. ! 216: .HP ! 217: .BI `{ command } ! 218: .br ! 219: .I rc ! 220: executes the ! 221: .I command ! 222: and reads its standard output, splitting it into a list of arguments, ! 223: using characters in ! 224: .B $ifs ! 225: as separators. ! 226: If ! 227: .B $ifs ! 228: is not otherwise set, its value is ! 229: .BR "'\ \et\en'" . ! 230: .HP ! 231: .BI <{ command } ! 232: .HP ! 233: .BI >{ command } ! 234: .br ! 235: The ! 236: .I command ! 237: is executed asynchronously with its standard output or standard input ! 238: connected to a pipe. ! 239: The value of the argument is the name of a file ! 240: referring to the other end of the pipe. ! 241: This allows the construction of ! 242: non-linear pipelines. ! 243: For example, the following runs two commands ! 244: .B old ! 245: and ! 246: .B new ! 247: and uses ! 248: .B cmp ! 249: to compare their outputs ! 250: .EX ! 251: cmp <{old} <{new} ! 252: .EE ! 253: This feature does not work on systems that do not support ! 254: .B /dev/fd ! 255: or its equivalent, e.g. on Sunos and System V. ! 256: .HP ! 257: .IB argument ^ argument ! 258: .br ! 259: The ! 260: .B ^ ! 261: operator concatenates its two operands. ! 262: If the two operands ! 263: have the same number of components, they are concatenated pairwise. ! 264: If not, ! 265: then one operand must have one component, and the other must be non-empty, ! 266: and concatenation is distributive. ! 267: .PD ! 268: .SS Free Carets ! 269: In a most circumstances, ! 270: .I rc ! 271: will insert the ! 272: .B ^ ! 273: operator automatically between words that are not separated by white space. ! 274: Whenever one of ! 275: .B $ ' ` ! 276: follows a quoted or unquoted word or an unquoted word follows a quoted word ! 277: with no intervening blanks or tabs, ! 278: a ! 279: .B ^ ! 280: is inserted between the two. ! 281: If an unquoted word immediately follows a ! 282: .BR $ ! 283: and contains a character other than an alphanumeric, underscore, ! 284: or ! 285: .BR * , ! 286: a ! 287: .B ^ ! 288: is inserted before the first such character. ! 289: Thus ! 290: .IP ! 291: .B cc -$flags $stem.c ! 292: .LP ! 293: is equivalent to ! 294: .IP ! 295: .B cc -^$flags $stem^.c ! 296: .SS I/O Redirections ! 297: The sequence ! 298: .BI > file ! 299: redirects the standard output file (file descriptor 1, normally the ! 300: terminal) to the named ! 301: .I file; ! 302: .BI >> file ! 303: appends standard output to the file. ! 304: The standard input file (file descriptor 0, also normally the terminal) ! 305: may be redirected from a file by the sequence ! 306: .BI < file , ! 307: or from an inline `here document' ! 308: by the sequence ! 309: .BI << eof-marker . ! 310: The contents of a here document are lines of text taken from the command ! 311: input stream up to a line containing nothing but the ! 312: .I eof-marker, ! 313: which may be either a quoted or unquoted word. ! 314: If ! 315: .I eof-marker ! 316: is unquoted, variable names of the form ! 317: .BI $ word ! 318: have their values substituted from ! 319: .I rc's ! 320: environment. ! 321: If ! 322: .BI $ word ! 323: is followed by a caret ! 324: .RB ( ^ ), ! 325: the caret is deleted. ! 326: If ! 327: .I eof-marker ! 328: is quoted, no substitution occurs. ! 329: .PP ! 330: Redirections may be applied to a file-descriptor other than standard input ! 331: or output by qualifying the redirection operator ! 332: with a number in square brackets. ! 333: For example, the diagnostic output (file descriptor 2) ! 334: may be redirected by writing ! 335: .BR "cc junk.c >[2]junk" . ! 336: .PP ! 337: A file descriptor may be redirected to an already open descriptor by writing ! 338: .BI >[ fd0 = fd1 ] ! 339: or ! 340: .BI <[ fd0 = fd1 ]. ! 341: .I Fd1 ! 342: is a previously opened file descriptor, and ! 343: .I fd0 ! 344: becomes a new copy (in the sense of ! 345: .IR dup (2)) ! 346: of it. ! 347: A file descriptor may be closed by writing ! 348: .BI >[ fd0 =] ! 349: or ! 350: .BI <[ fd0 =]. ! 351: .PP ! 352: Redirections are executed from left to right. ! 353: Therefore, ! 354: .B cc junk.c >/dev/null >[2=1] ! 355: and ! 356: .B cc junk.c >[2=1] >/dev/null ! 357: have different effects \(mi the first puts standard output in ! 358: .BR /dev/null , ! 359: and then puts diagnostic output in the same place, where the second ! 360: directs diagnostic output to the terminal and sends standard output to ! 361: .BR /dev/null . ! 362: .SS Compound Commands ! 363: A pair of commands separated by a pipe operator ! 364: .RB ( | ) ! 365: is a command. ! 366: The standard output of the left command is sent through a pipe ! 367: to the standard input of the right command. ! 368: The pipe operator may be decorated ! 369: to use different file descriptors. ! 370: .BI |[ fd ] ! 371: connects the output end of the pipe to file descriptor ! 372: .I fd ! 373: rather than 1. ! 374: .BI |[ fd0 = fd1 ] ! 375: connects output to ! 376: .I fd0 ! 377: of the left command and input to ! 378: .I fd1 ! 379: of the right command. ! 380: .PP ! 381: A pair of commands separated by ! 382: .B && ! 383: or ! 384: .B || ! 385: is a command. ! 386: In either case, the left command is executed and its exit status examined. ! 387: If the operator is ! 388: .B && ! 389: the right command is executed if the left command's status is zero. ! 390: .B || ! 391: causes the right command to be executed if the left command's status is non-zero. ! 392: .PP ! 393: The exit status of a command may be inverted (non-zero is changed to zero, zero ! 394: is changed to one) by preceding it with a ! 395: .BR ! . ! 396: .PP ! 397: The ! 398: .B | ! 399: operator has highest precedence, and is left-associative (i.e. binds tighter ! 400: to the left than the right.) ! 401: .B ! ! 402: has intermediate precedence, and ! 403: .B && ! 404: and ! 405: .B || ! 406: have the lowest precedence. ! 407: .PP ! 408: The unary ! 409: .B @ ! 410: operator, with precedence equal to ! 411: .BR ! , ! 412: causes its operand to be executed in a subshell. ! 413: .PP ! 414: Each of the following is a command. ! 415: .PD 0 ! 416: .HP ! 417: .B if ( ! 418: .I list ! 419: .B ) ! 420: .I command ! 421: .br ! 422: A ! 423: .I list ! 424: is a sequence of commands, separated by ! 425: .BR & , ! 426: .B ; ! 427: or newline. ! 428: It is executed and ! 429: if its exit status is zero, the ! 430: .I command ! 431: is executed. ! 432: .HP ! 433: .B if not ! 434: .I command ! 435: .br ! 436: The immediately preceding command must have been ! 437: .B if ( ! 438: .I list ! 439: .B ) ! 440: .IR command . ! 441: If its condition was non-zero, the ! 442: .I command ! 443: is executed. ! 444: .HP ! 445: .B for ( ! 446: .I name ! 447: .B in ! 448: .I arguments ! 449: .B ) ! 450: .I command ! 451: .HP ! 452: .B for ( ! 453: .I name ! 454: .B ) ! 455: .I command ! 456: .br ! 457: The ! 458: .I command ! 459: is executed once for each ! 460: .IR argument ! 461: with that argument assigned to ! 462: .IR name . ! 463: If the argument list is omitted, ! 464: .B $* ! 465: is used. ! 466: .HP ! 467: .B while ( ! 468: .I list ! 469: .B ) ! 470: .I command ! 471: .br ! 472: The ! 473: .I list ! 474: is executed repeatedly until its exit status is non-zero. ! 475: Each time it returns zero status, the ! 476: .I command ! 477: is executed. ! 478: The empty ! 479: .I list ! 480: always yields zero status. ! 481: .HP ! 482: .BI "switch(" argument "){" list } ! 483: .br ! 484: The ! 485: .IR list ! 486: is searched for simple commands beginning with the word ! 487: .BR case . ! 488: (The search is only at the `top level' of the ! 489: .IR list . ! 490: That is, ! 491: .BR case s ! 492: in nested constructs are not found.) ! 493: .I Argument ! 494: is matched against each word following ! 495: .B case ! 496: using the pattern-matching algorithm described above, except that ! 497: .B / ! 498: and the first characters of ! 499: .B . ! 500: and ! 501: .B .. ! 502: need not be matched explicitly. ! 503: When a match is found, commands in the list are executed up to the next ! 504: following ! 505: .B case ! 506: command (at the top level) or the closing parenthesis. ! 507: .HP ! 508: .BI { list } ! 509: .br ! 510: Braces serve to alter the grouping of commands implied by operator ! 511: priorities. ! 512: The ! 513: .I body ! 514: is a sequence of commands separated by ! 515: .BR & , ! 516: .B ; ! 517: or newline. ! 518: .HP ! 519: .BI "fn " name { list } ! 520: .HP ! 521: .BI "fn " name ! 522: .br ! 523: The first form defines a function with the given ! 524: .IR name . ! 525: Subsequently, whenever a command whose first argument is ! 526: .I name ! 527: is encountered, the current value of ! 528: the remainder of the command's argument list will be assigned to ! 529: .BR $* , ! 530: after saving its current value, and ! 531: .I rc ! 532: will execute the ! 533: .IR list . ! 534: The second form removes ! 535: .IR name 's ! 536: function definition. ! 537: .HP ! 538: .BI "fn " signal { list } ! 539: .br ! 540: .HP ! 541: .BI "fn " signal ! 542: .br ! 543: A function with the name of a signal, in lower case, is defined ! 544: in the usual way, but called when ! 545: .I rc ! 546: receives that signal; see ! 547: .IR signal (2). ! 548: By default ! 549: .I rc ! 550: exits on receiving any signal, except when run interactively, ! 551: in which case interrupts and quits normally cause ! 552: .I rc ! 553: to stop whatever it's doing and start reading a new command. ! 554: The second form causes ! 555: .I rc ! 556: to handle a signal in the default manner. ! 557: .I Rc ! 558: recognizes an artificial signal, ! 559: .BR sigexit , ! 560: which occurs when ! 561: .I rc ! 562: is about to finish executing. ! 563: .HP ! 564: .IB name = "argument command" ! 565: .br ! 566: Any command may be preceded by a sequence of assignments ! 567: interspersed with redirections. ! 568: The assignments remain in effect until the end of the command, unless ! 569: the command is empty (i.e. the assignments stand alone), in which case ! 570: they are effective until rescinded by later assignments. ! 571: .PD ! 572: .SS Built-in Commands ! 573: These commands are executed internally by ! 574: .IR rc , ! 575: usually because their execution changes or depends on ! 576: .IR rc 's ! 577: internal state. ! 578: .PD 0 ! 579: .HP ! 580: .BI . " file ..." ! 581: .br ! 582: Execute commands from ! 583: .IR file . ! 584: .B $* ! 585: is set for the duration to the remainder of the argument list following ! 586: .IR file . ! 587: .I File ! 588: is searched for using ! 589: .BR $path . ! 590: .HP ! 591: .BI builtin " command ..." ! 592: .br ! 593: Execute ! 594: .I command ! 595: as usual except that any function named ! 596: .I command ! 597: is ignored. ! 598: .HP ! 599: .BI "cd [" dir "]" ! 600: .br ! 601: Change the current directory to ! 602: .IR dir . ! 603: The default argument is ! 604: .BR $home . ! 605: .I dir ! 606: is searched for in each of the directories mentioned in ! 607: .BR $cdpath . ! 608: .HP ! 609: .BI "eval [" "arg ..." "]" ! 610: .br ! 611: The arguments are concatenated separated by spaces into a single string, ! 612: read as input to ! 613: .IR rc , ! 614: and executed. ! 615: .HP ! 616: .BI "exec [" "command ..." "]" ! 617: .br ! 618: .I Rc ! 619: replaces itself with the given (non-built-in) ! 620: .IR command . ! 621: .HP ! 622: .BR "exit [" status "]" ! 623: .br ! 624: Exit with the given exit status. ! 625: If none is given, the current value of ! 626: .B $status ! 627: is used. ! 628: .HP ! 629: .BI "shift [" n "]" ! 630: .br ! 631: Delete the first ! 632: .IR n ! 633: (default 1) ! 634: elements of ! 635: .BR $* . ! 636: .HP ! 637: .BI "umask [" octal "]" ! 638: .br ! 639: Set ! 640: .IR rc 's ! 641: file-creation mask (see ! 642: .IR umask (2)) ! 643: to the given octal value. ! 644: If no value is given, the current ! 645: mask value is printed. ! 646: .HP ! 647: .BI "wait [" pid "]" ! 648: .br ! 649: Wait for the process with the given ! 650: .I pid ! 651: to exit. ! 652: If no ! 653: .I pid ! 654: is given, all outstanding processes are waited for. ! 655: .HP ! 656: .BI whatis " name ..." ! 657: .br ! 658: Print the value of each ! 659: .I name ! 660: in a form suitable for input to ! 661: .IR rc . ! 662: The output is ! 663: an assignment to any variable, ! 664: the definition of any function, ! 665: a call to ! 666: .B builtin ! 667: for any built-in command, or ! 668: the full path name of any binary. ! 669: .HP ! 670: .BI ~ " subject pattern ..." ! 671: .br ! 672: The ! 673: .I subject ! 674: is matched against each ! 675: .I pattern ! 676: in sequence. ! 677: If it matches any pattern, ! 678: .B $status ! 679: is set to zero. ! 680: Otherwise, ! 681: .B $status ! 682: is set to one. ! 683: Patterns are the same as for file name matching, except that ! 684: .B / ! 685: and the first character of ! 686: .B . ! 687: and ! 688: .B .. ! 689: need not be matched explicitly. ! 690: The ! 691: .I patterns ! 692: are not subjected to ! 693: file name matching before the ! 694: .B ~ ! 695: command is executed, so they need not be enclosed in quotation marks. ! 696: .PD ! 697: .SS Environment ! 698: The ! 699: .I environment ! 700: is a list of strings made available to executing binaries. ! 701: .I Rc ! 702: creates an environment entry for each variable whose value is non-empty, ! 703: and for each function. ! 704: The string for a variable entry has the variable's name followed by ! 705: .B = ! 706: and its value. ! 707: If the value has more than one component, these ! 708: are separated by ctrl-a ! 709: .RB ( '\e001' ) ! 710: characters. ! 711: The string for a function is just the ! 712: .I rc ! 713: input that defines the function. ! 714: .PP ! 715: When ! 716: .I rc ! 717: starts executing it reads variable and function definitions from its ! 718: environment. ! 719: .SS Special Variables ! 720: The following variables are set or used by ! 721: .IR rc . ! 722: .PD 0 ! 723: .TP ! 724: .B $* ! 725: Set to ! 726: .IR rc 's ! 727: argument list during initialization. ! 728: Whenever a ! 729: .B . ! 730: command or a function is executed, the current value is saved and ! 731: .B $* ! 732: receives the new argument list. ! 733: The saved value is restored on completion of the ! 734: .B . ! 735: or function. ! 736: .TP ! 737: .B $apid ! 738: Whenever a process is started asynchronously with ! 739: .BR & , ! 740: .B $apid ! 741: is set to its process id. ! 742: .TP ! 743: .B $home ! 744: The default directory for ! 745: .BR cd . ! 746: Initially, if ! 747: .B $home ! 748: is not set and ! 749: .B $HOME ! 750: is, then ! 751: .B $home ! 752: is set to the value of ! 753: .BR $HOME . ! 754: .TP ! 755: .B $ifs ! 756: The input field separators used in backquote substitutions. ! 757: If ! 758: .B $ifs ! 759: is not set in ! 760: .IR rc 's ! 761: environment, it is initialized to blank, tab and newline. ! 762: .TP ! 763: .B $path ! 764: The search path used to find commands and input files ! 765: for the ! 766: .B . ! 767: command. ! 768: If not set in the environment, it is initialized by ! 769: .BR "path=(.\ /bin\ /usr/bin)" . ! 770: .TP ! 771: .B $pid ! 772: Set during initialization to ! 773: .IR rc 's ! 774: process id. ! 775: .TP ! 776: .B $prompt ! 777: When ! 778: .I rc ! 779: is run interactively, the first component of ! 780: .B $prompt ! 781: is printed before reading each command. ! 782: The second component is printed whenever a newline is typed and more lines ! 783: are required to complete the command. ! 784: If not set in the environment, it is initialized by ! 785: .BR "prompt=('%\ '\ '\ ')" . ! 786: .TP ! 787: .B $status ! 788: Set to the low 8 bits of the ! 789: .IR exit (2) ! 790: argument of a normally terminating binary ! 791: (unless started with ! 792: .BR &), ! 793: or to 1000 plus the termination status on abnormal termination. ! 794: .B ! ! 795: and ! 796: .B ~ ! 797: also change ! 798: .BR $status . ! 799: Its value is used to control execution in ! 800: .BR && , ! 801: .BR || , ! 802: .B if ! 803: and ! 804: .B while ! 805: commands. ! 806: When ! 807: .I rc ! 808: exits at end-of-file of its input or on executing an ! 809: .B exit ! 810: command with no argument, ! 811: .B $status ! 812: is its exit status. ! 813: .PD ! 814: .SS Invocation ! 815: If ! 816: .I rc ! 817: is started with no arguments it reads commands from standard input. ! 818: Otherwise its first non-flag argument is the name of a file from which ! 819: to read commands (but see ! 820: .B -c ! 821: below). ! 822: Subsequent arguments become the initial value of ! 823: .BR $* . ! 824: .I Rc ! 825: accepts the following command-line flags. ! 826: .PD 0 ! 827: .TP ! 828: .BI -c " string" ! 829: Commands are read from ! 830: .IR string . ! 831: .TP ! 832: .B -d ! 833: Debugging flag, causes ! 834: .I rc ! 835: only to catch ! 836: .BR SIGINT , ! 837: so that ! 838: .B SIGQUIT ! 839: will cause it to dump core. ! 840: .TP ! 841: .B -e ! 842: Exit if ! 843: .B $status ! 844: is non-zero after executing a simple command. ! 845: .TP ! 846: .B -i ! 847: If ! 848: .B -i ! 849: is present, or ! 850: .I rc ! 851: is given no arguments and its standard input is a terminal, ! 852: it runs interactively. ! 853: Commands are prompted for using ! 854: .B $prompt ! 855: and ! 856: .B SIGINT ! 857: and ! 858: .B SIGQUIT ! 859: are caught and sloughed off. ! 860: .TP ! 861: .B -l ! 862: If ! 863: .B -l ! 864: is given or the first character of argument zero is ! 865: .BR - , ! 866: .I rc ! 867: reads commands from ! 868: .BR $home/.rcrc , ! 869: if it exists, before reading its normal input. ! 870: .TP ! 871: .B -p ! 872: A no-op. ! 873: .TP ! 874: .B -v ! 875: Echo input on file descriptor 2 as it is read. ! 876: .TP ! 877: .B -x ! 878: Print each simple command before executing it. ! 879: .PD ! 880: .SH BUGS ! 881: It's too slow and too big. ! 882: .br ! 883: There should be away to match patterns against whole lists rather than ! 884: just single strings. ! 885: .br ! 886: Using ! 887: .B ~ ! 888: to check the value of ! 889: .B $status ! 890: changes ! 891: .BR $status . ! 892: .br ! 893: Functions that use here documents don't work. ! 894: .br ! 895: Environment entries for variables are kludgy for UNIX compatibility. ! 896: Woe betide the imported variable whose value contains a ctrl-a.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.