|
|
1.1 ! root 1: .\" Copyright (c) 1980 Regents of the University of California. ! 2: .\" All rights reserved. The Berkeley software License Agreement ! 3: .\" specifies the terms and conditions for redistribution. ! 4: .\" ! 5: .\" @(#)csh.1 6.1 (Berkeley) 5/23/86 ! 6: .\" ! 7: .EH 'USD:4-%''An Introduction to the C shell' ! 8: .OH 'An Introduction to the C shell''USD:4-%' ! 9: .\".RP ! 10: .TL ! 11: An Introduction to the C shell ! 12: .AU ! 13: William Joy ! 14: (revised for 4.3BSD by Mark Seiden) ! 15: .AI ! 16: Computer Science Division ! 17: .br ! 18: Department of Electrical Engineering and Computer Science ! 19: .br ! 20: University of California, Berkeley ! 21: .br ! 22: Berkeley, California 94720 ! 23: .AB ! 24: .I Csh ! 25: is a new command language interpreter for ! 26: .UX ! 27: systems. ! 28: It incorporates good features of other shells and a ! 29: .I history ! 30: mechanism similar to the ! 31: .I redo ! 32: of \s-2INTERLISP\s0. ! 33: While incorporating many features of other shells which make ! 34: writing shell programs (shell scripts) easier, ! 35: most of the features unique to ! 36: .I csh ! 37: are designed more for the interactive \s-2UNIX\s0 user. ! 38: .PP ! 39: \s-2UNIX\s0 ! 40: users who have read a general introduction to the system ! 41: will find a valuable basic explanation of the shell here. ! 42: Simple terminal interaction with ! 43: .I csh ! 44: is possible after reading just the first section of this document. ! 45: The second section describes the shell's capabilities which you can ! 46: explore after you have begun to become acquainted with the shell. ! 47: Later sections introduce features which are useful, but not necessary ! 48: for all users of the shell. ! 49: .PP ! 50: Additional information includes an appendix listing special characters of the shell ! 51: and a glossary of terms and commands introduced in this manual. ! 52: .AE ! 53: .SH ! 54: .if n .ND ! 55: Introduction ! 56: .PP ! 57: A ! 58: .I shell ! 59: is a command language interpreter. ! 60: .I Csh ! 61: is the name of one particular command interpreter on ! 62: \s-2UNIX\s0. ! 63: The primary purpose of ! 64: .I csh ! 65: is to translate command lines typed at a terminal into ! 66: system actions, such as invocation of other programs. ! 67: .I Csh ! 68: is a user program just like any you might write. ! 69: Hopefully, ! 70: .I csh ! 71: will be a very useful program for you ! 72: in interacting with the \s-2UNIX\s0 system. ! 73: .PP ! 74: In addition to this document, you will want to refer to a copy ! 75: of the \s-2UNIX\s0 User Reference Manual. ! 76: The ! 77: .I csh ! 78: documentation in section 1 of the manual provides a full description of all ! 79: features of the shell and is the definitive reference for questions ! 80: about the shell. ! 81: .PP ! 82: Many words in this document are shown in ! 83: .I italics. ! 84: These are important words; ! 85: names of commands, and words which have special meaning in discussing ! 86: the shell and \s-2UNIX\s0. ! 87: Many of the words are defined in a glossary at the end of this document. ! 88: If you don't know what is meant by a word, you should look ! 89: for it in the glossary. ! 90: .SH ! 91: Acknowledgements ! 92: .PP ! 93: Numerous people have provided good input about previous versions ! 94: of ! 95: .I csh ! 96: and aided in its debugging and in the debugging of its documentation. ! 97: I would especially like to thank Michael Ubell ! 98: who made the crucial observation that history commands could be ! 99: done well over the word structure of input text, and implemented ! 100: a prototype history mechanism in an older version of the shell. ! 101: Eric Allman has also provided a large number of useful comments on the ! 102: shell, helping to unify those concepts which are present and to identify ! 103: and eliminate useless and marginally useful features. ! 104: Mike O'Brien suggested the pathname hashing ! 105: mechanism which speeds command execution. ! 106: Jim Kulp added the job control and directory stack primitives and ! 107: added their documentation to this introduction. ! 108: .br ! 109: .bp ! 110: .NH ! 111: Terminal usage of the shell ! 112: .NH 2 ! 113: The basic notion of commands ! 114: .PP ! 115: A ! 116: .I shell ! 117: in ! 118: \s-2UNIX\s0 ! 119: acts mostly as a medium through which other ! 120: .I programs ! 121: are invoked. ! 122: While it has a set of ! 123: .I builtin ! 124: functions which it performs directly, ! 125: most commands cause execution of programs that are, in fact, ! 126: external to the shell. ! 127: The shell is thus distinguished from the command interpreters of other ! 128: systems both by the fact that it is just a user program, and by the fact ! 129: that it is used almost exclusively as a mechanism for invoking other programs. ! 130: .PP ! 131: .I Commands ! 132: in the \s-2UNIX\s0 system consist of a list of strings or ! 133: .I words ! 134: interpreted as a ! 135: .I "command name" ! 136: followed by ! 137: .I arguments. ! 138: Thus the command ! 139: .DS ! 140: mail bill ! 141: .DE ! 142: consists of two words. ! 143: The first word ! 144: .I mail ! 145: names the command to be executed, in this case the ! 146: mail program which sends messages to other users. ! 147: The shell uses the name of the command in attempting to execute it for you. ! 148: It will look in a number of ! 149: .I directories ! 150: for a file with the name ! 151: .I mail ! 152: which is expected to contain the mail program. ! 153: .PP ! 154: The rest of the words of the command are given as ! 155: .I arguments ! 156: to the command itself when it is executed. ! 157: In this case we specified also the argument ! 158: .I bill ! 159: which is interpreted by the ! 160: .I mail ! 161: program to be the name of a user to whom mail is to be sent. ! 162: In normal terminal usage we might use the ! 163: .I mail ! 164: command as follows. ! 165: .DS ! 166: % mail bill ! 167: I have a question about the csh documentation. ! 168: My document seems to be missing page 5. ! 169: Does a page five exist? ! 170: Bill ! 171: EOT ! 172: % ! 173: .DE ! 174: .PP ! 175: Here we typed a message to send to ! 176: .I bill ! 177: and ended this message with a ^D which sent an end-of-file to ! 178: the mail program. ! 179: (Here and throughout this document, the notation ``^\fIx\fR'' ! 180: is to be read ``control-\fIx\fR'' and represents the striking of the \fIx\fR ! 181: key while the control key is held down.) ! 182: The mail program ! 183: then echoed the characters `EOT' and transmitted our message. ! 184: The characters `% ' were printed before and after the mail command ! 185: by the shell to indicate that input was needed. ! 186: .PP ! 187: After typing the `% ' prompt the shell was reading command input from ! 188: our terminal. ! 189: We typed a complete command `mail bill'. ! 190: The shell then executed the ! 191: .I mail ! 192: program with argument ! 193: .I bill ! 194: and went dormant waiting for it to complete. ! 195: The mail program then read input from our terminal until we signalled ! 196: an end-of-file via typing a ^D after which the shell noticed ! 197: that mail had completed ! 198: and signaled us that it was ready to read from the terminal again by ! 199: printing another `% ' prompt. ! 200: .PP ! 201: This is the essential pattern of all interaction with \s-2UNIX\s0 ! 202: through the shell. ! 203: A complete command is typed at the terminal, the shell executes ! 204: the command and when this execution completes, it prompts for a new command. ! 205: If you run the editor for an hour, the shell will patiently wait for ! 206: you to finish editing and obediently prompt you again whenever you finish ! 207: editing. ! 208: .PP ! 209: An example of a useful command you can execute now is the ! 210: .I tset ! 211: command, which sets the default ! 212: .I erase ! 213: and ! 214: .I kill ! 215: characters on your terminal \- the erase character erases the last ! 216: character you typed and the kill character erases the entire line you ! 217: have entered so far. ! 218: By default, the erase character is the delete key (equivalent to `^?') ! 219: and the kill character is `^U'. Some people prefer to make the erase character ! 220: the backspace key (equivalent to `^H'). ! 221: You can make this be true by typing ! 222: .DS ! 223: tset \-e ! 224: .DE ! 225: which tells the program ! 226: .I tset ! 227: to set the erase character to tset's default setting for this character ! 228: (a backspace). ! 229: .NH 2 ! 230: Flag arguments ! 231: .PP ! 232: A useful notion in \s-2UNIX\s0 is that of a ! 233: .I flag ! 234: argument. ! 235: While many arguments to commands specify file names or user names, ! 236: some arguments rather specify an optional capability of the command ! 237: which you wish to invoke. ! 238: By convention, such arguments begin with the character `\-' (hyphen). ! 239: Thus the command ! 240: .DS ! 241: ls ! 242: .DE ! 243: will produce a list of the files in the current ! 244: .I "working directory" . ! 245: The option ! 246: .I \-s ! 247: is the size option, and ! 248: .DS ! 249: ls \-s ! 250: .DE ! 251: causes ! 252: .I ls ! 253: to also give, for each file the size of the file in blocks of 512 ! 254: characters. ! 255: The manual section for each command in the \s-2UNIX\s0 reference manual ! 256: gives the available options for each command. ! 257: The ! 258: .I ls ! 259: command has a large number of useful and interesting options. ! 260: Most other commands have either no options or only one or two options. ! 261: It is hard to remember options of commands which are not used very ! 262: frequently, so most \s-2UNIX\s0 utilities perform only one or two functions ! 263: rather than having a large number of hard to remember options. ! 264: .NH 2 ! 265: Output to files ! 266: .PP ! 267: Commands that normally read input or write output on the terminal ! 268: can also be executed with this input and/or output done to ! 269: a file. ! 270: .PP ! 271: Thus suppose we wish to save the current date in a file called `now'. ! 272: The command ! 273: .DS ! 274: date ! 275: .DE ! 276: will print the current date on our terminal. ! 277: This is because our terminal is the default ! 278: .I "standard output" ! 279: for the date command and the date command prints the date on its ! 280: standard output. ! 281: The shell lets us ! 282: .I redirect ! 283: the ! 284: .I "standard output" ! 285: of a command through a ! 286: notation using the ! 287: .I metacharacter ! 288: `>' and the name of the file where output is to be placed. ! 289: Thus the command ! 290: .DS ! 291: date > now ! 292: .DE ! 293: runs the ! 294: .I date ! 295: command such that its standard output is ! 296: the file `now' rather than the terminal. ! 297: Thus this command places the current date and time into the file `now'. ! 298: It is important to know that the ! 299: .I date ! 300: command was unaware that its output was going to a file rather than ! 301: to the terminal. ! 302: The shell performed this ! 303: .I redirection ! 304: before the command began executing. ! 305: .PP ! 306: One other thing to note here is that the file `now' ! 307: need not have existed before the ! 308: .I date ! 309: command was executed; the shell would have created the file if it did ! 310: not exist. ! 311: And if the file did exist? ! 312: If it had existed previously these previous contents would have been discarded! ! 313: A shell option ! 314: .I noclobber ! 315: exists to prevent this from happening accidentally; ! 316: it is discussed in section 2.2. ! 317: .PP ! 318: The system normally keeps files which you create with `>' and all other files. ! 319: Thus the default is for files to be permanent. If you wish to create a file ! 320: which will be removed automatically, you can begin its name with a `#' ! 321: character, this `scratch' character denotes the fact that the file will ! 322: be a scratch file.* ! 323: .FS ! 324: *Note that if your erase character is a `#', you will have to precede the ! 325: `#' with a `\e'. The fact that the `#' character is the old (pre-\s-2CRT\s0) ! 326: standard erase character means that it seldom appears in a file name, and ! 327: allows this convention to be used for scratch files. If you are using a ! 328: \s-2CRT\s0, your erase character should be a ^H, as we demonstrated ! 329: in section 1.1 how this could be set up. ! 330: .FE ! 331: The system will remove such files after a couple of days, ! 332: or sooner if file space becomes very tight. ! 333: Thus, in running the ! 334: .I date ! 335: command above, we don't really want to save the output forever, so we ! 336: would more likely do ! 337: .DS ! 338: date > #now ! 339: .DE ! 340: .NH 2 ! 341: Metacharacters in the shell ! 342: .PP ! 343: The shell has a large number of ! 344: special characters (like `>') ! 345: which indicate special functions. ! 346: We say that these notations have ! 347: .I syntactic ! 348: and ! 349: .I semantic ! 350: meaning to the shell. ! 351: In general, most characters which are neither letters nor digits ! 352: have special meaning to the shell. ! 353: We shall shortly learn a means of ! 354: .I quotation ! 355: which allows us to use ! 356: .I metacharacters ! 357: without the shell treating them in any special way. ! 358: .PP ! 359: Metacharacters normally have effect only when the shell is reading ! 360: our input. ! 361: We need not worry about placing shell metacharacters in a letter ! 362: we are sending via ! 363: .I mail, ! 364: or when we are typing in text or data to some other program. ! 365: Note that the shell is only reading input when it has prompted with ! 366: `% ' (although we can type our input even before it prompts). ! 367: .NH 2 ! 368: Input from files; pipelines ! 369: .PP ! 370: We learned above how to ! 371: .I redirect ! 372: the ! 373: .I "standard output" ! 374: of a command ! 375: to a file. ! 376: It is also possible to redirect the ! 377: .I "standard input" ! 378: of a command from a file. ! 379: This is not often necessary since most commands will read from ! 380: a file whose name is given as an argument. ! 381: We can give the command ! 382: .DS ! 383: sort < data ! 384: .DE ! 385: to run the ! 386: .I sort ! 387: command with standard input, where the command normally ! 388: reads its input, from the file ! 389: `data'. ! 390: We would more likely say ! 391: .DS ! 392: sort data ! 393: .DE ! 394: letting the ! 395: .I sort ! 396: command open the file ! 397: `data' ! 398: for input itself since this is less to type. ! 399: .PP ! 400: We should note that if we just typed ! 401: .DS ! 402: sort ! 403: .DE ! 404: then the sort program would sort lines from its ! 405: .I "standard input." ! 406: Since we did not ! 407: .I redirect ! 408: the standard input, it would sort lines as we typed them on the terminal ! 409: until we typed a ^D to indicate an end-of-file. ! 410: .PP ! 411: A most useful capability is the ability to combine the standard output ! 412: of one command with the standard input of another, i.e. to run the ! 413: commands in a sequence known as a ! 414: .I pipeline. ! 415: For instance the command ! 416: .DS ! 417: ls \-s ! 418: .DE ! 419: normally produces a list of the files in our directory with the size ! 420: of each in blocks of 512 characters. ! 421: If we are interested in learning which of our files is largest we ! 422: may wish to have this sorted by size rather than by name, which is ! 423: the default way in which ! 424: .I ls ! 425: sorts. ! 426: We could look at the many options of ! 427: .I ls ! 428: to see if there was an option to do this but would eventually discover ! 429: that there is not. ! 430: Instead we can use a couple of simple options of the ! 431: .I sort ! 432: command, combining it with ! 433: .I ls ! 434: to get what we want. ! 435: .PP ! 436: The ! 437: .I \-n ! 438: option of sort specifies a numeric sort rather than an alphabetic sort. ! 439: Thus ! 440: .DS ! 441: ls \-s | sort \-n ! 442: .DE ! 443: specifies that the output of the ! 444: .I ls ! 445: command run with the option ! 446: .I \-s ! 447: is to be ! 448: .I piped ! 449: to the command ! 450: .I sort ! 451: run with the numeric sort option. ! 452: This would give us a sorted list of our files by size, but with the ! 453: smallest first. ! 454: We could then use the ! 455: .I \-r ! 456: reverse sort option and the ! 457: .I head ! 458: command in combination with the previous command doing ! 459: .DS ! 460: ls \-s | sort \-n \-r | head \-5 ! 461: .DE ! 462: Here we have taken a list of our files sorted alphabetically, ! 463: each with the size in blocks. ! 464: We have run this to the standard input of the ! 465: .I sort ! 466: command asking it to sort numerically in reverse order (largest first). ! 467: This output has then been run into the command ! 468: .I head ! 469: which gives us the first few lines. ! 470: In this case we have asked ! 471: .I head ! 472: for the first 5 lines. ! 473: Thus this command gives us the names and sizes of our 5 largest files. ! 474: .PP ! 475: The notation introduced above is called the ! 476: .I pipe ! 477: mechanism. ! 478: Commands separated by `\||\|' characters are connected together by the ! 479: shell and the standard output of each is run into the standard input of the ! 480: next. ! 481: The leftmost command in a pipeline will normally take its standard ! 482: input from the terminal and the rightmost will place its standard ! 483: output on the terminal. ! 484: Other examples of pipelines will be given later when we discuss the ! 485: history mechanism; ! 486: one important use of pipes which is illustrated there is in the ! 487: routing of information to the line printer. ! 488: .NH 2 ! 489: Filenames ! 490: .PP ! 491: Many commands to be executed will need the names of files as arguments. ! 492: \s-2UNIX\s0 ! 493: .I pathnames ! 494: consist of a number of ! 495: .I components ! 496: separated by `/'. ! 497: Each component except the last names a directory in which the next ! 498: component resides, in effect specifying the ! 499: .I path ! 500: of directories to follow to reach the file. ! 501: Thus the pathname ! 502: .DS ! 503: /etc/motd ! 504: .DE ! 505: specifies a file in the directory ! 506: `etc' ! 507: which is a subdirectory of the ! 508: .I root ! 509: directory `/'. ! 510: Within this directory the file named is `motd' which stands ! 511: for `message of the day'. ! 512: A ! 513: .I pathname ! 514: that begins with a slash is said to be an ! 515: .I absolute ! 516: pathname since it is specified from the absolute top of the entire ! 517: directory hierarchy of the system (the ! 518: .I root ). ! 519: .I Pathnames ! 520: which do not begin with `/' are interpreted as starting in the current ! 521: .I "working directory" , ! 522: which is, by default, your ! 523: .I home ! 524: directory and can be changed dynamically by the ! 525: .I cd ! 526: change directory command. ! 527: Such pathnames are said to be ! 528: .I relative ! 529: to the working directory since they are found by starting ! 530: in the working directory and descending to lower levels of directories ! 531: for each ! 532: .I component ! 533: of the pathname. If the pathname contains no slashes at all then the ! 534: file is contained in the working directory itself and the pathname is merely ! 535: the name of the file in this directory. ! 536: Absolute pathnames have no relation ! 537: to the working directory. ! 538: .PP ! 539: Most filenames consist of a number of alphanumeric characters and ! 540: `.'s (periods). ! 541: In fact, all printing characters except `/' (slash) may appear in filenames. ! 542: It is inconvenient to have most non-alphabetic characters in filenames ! 543: because many of these have special meaning to the shell. ! 544: The character `.' (period) is not a shell-metacharacter and is often used ! 545: to separate the ! 546: .I extension ! 547: of a file name from the base of the name. ! 548: Thus ! 549: .DS ! 550: prog.c prog.o prog.errs prog.output ! 551: .DE ! 552: are four related files. ! 553: They share a ! 554: .I base ! 555: portion of a name ! 556: (a base portion being that part of the name that is left when a trailing ! 557: `.' and following characters which are not `.' are stripped off). ! 558: The file ! 559: `prog.c' ! 560: might be the source for a C program, ! 561: the file `prog.o' the corresponding object file, ! 562: the file ! 563: `prog.errs' the errors resulting from a compilation of the program ! 564: and the file ! 565: `prog.output' the output of a run of the program. ! 566: .PP ! 567: If we wished to refer to all four of these files in a command, we could ! 568: use the notation ! 569: .DS ! 570: prog.* ! 571: .DE ! 572: This expression is expanded by the shell, before the command to which it is ! 573: an argument is executed, into a list of names which begin with `prog.'. ! 574: The character `*' here matches any sequence (including the empty sequence) ! 575: of characters in a file name. ! 576: The names which match are alphabetically sorted and placed in the ! 577: .I "argument list" ! 578: of the command. ! 579: Thus the command ! 580: .DS ! 581: echo prog.* ! 582: .DE ! 583: will echo the names ! 584: .DS ! 585: prog.c prog.errs prog.o prog.output ! 586: .DE ! 587: Note that the names are in sorted order here, and a different ! 588: order than we listed them above. ! 589: The ! 590: .I echo ! 591: command receives four words as arguments, even though we only typed ! 592: one word as as argument directly. ! 593: The four words were generated by ! 594: .I "filename expansion" ! 595: of the one input word. ! 596: .PP ! 597: Other notations for ! 598: .I "filename expansion" ! 599: are also available. ! 600: The character `?' matches any single character in a filename. ! 601: Thus ! 602: .DS ! 603: echo ? \|?? \|??? ! 604: .DE ! 605: will echo a line of filenames; first those with one character names, ! 606: then those with two character names, and finally those with three ! 607: character names. ! 608: The names of each length will be independently sorted. ! 609: .PP ! 610: Another mechanism consists of a sequence of characters between `[' and `]'. ! 611: This metasequence matches any single character from the enclosed set. ! 612: Thus ! 613: .DS ! 614: prog.[co] ! 615: .DE ! 616: will match ! 617: .DS ! 618: prog.c prog.o ! 619: .DE ! 620: in the example above. ! 621: We can also place two characters around a `\-' in this notation to denote ! 622: a range. ! 623: Thus ! 624: .DS ! 625: chap.[1\-5] ! 626: .DE ! 627: might match files ! 628: .DS ! 629: chap.1 chap.2 chap.3 chap.4 chap.5 ! 630: .DE ! 631: if they existed. ! 632: This is shorthand for ! 633: .DS ! 634: chap.[12345] ! 635: .DE ! 636: and otherwise equivalent. ! 637: .PP ! 638: An important point to note is that if a list of argument words to ! 639: a command (an ! 640: .I "argument list)" ! 641: contains filename expansion syntax, and if this filename expansion syntax ! 642: fails to match any existing file names, then the shell considers this ! 643: to be an error and prints a diagnostic ! 644: .DS ! 645: No match. ! 646: .DE ! 647: and does not execute the command. ! 648: .PP ! 649: Another very important point is that files with the character `.' at the ! 650: beginning are treated specially. ! 651: Neither `*' or `?' or the `[' `]' mechanism will match it. ! 652: This prevents accidental matching of the filenames `.' and `..' ! 653: in the working directory which have special meaning to the system, ! 654: as well as other files such as ! 655: .I \&.cshrc ! 656: which are not normally ! 657: visible. ! 658: We will discuss the special role of the file ! 659: .I \&.cshrc ! 660: later. ! 661: .PP ! 662: Another filename expansion mechanism gives access to the pathname of ! 663: the ! 664: .I home ! 665: directory of other users. ! 666: This notation consists of the character `~' (tilde) followed by another user's ! 667: login name. ! 668: For instance the word `~bill' would map to the pathname `/usr/bill' ! 669: if the home directory for `bill' was `/usr/bill'. ! 670: Since, on large systems, users may have login directories scattered over ! 671: many different disk volumes with different prefix directory names, ! 672: this notation provides a convenient way of accessing the files ! 673: of other users. ! 674: .PP ! 675: A special case of this notation consists of a `~' alone, e.g. `~/mbox'. ! 676: This notation is expanded by the shell into the file `mbox' in your ! 677: .I home ! 678: directory, i.e. into `/usr/bill/mbox' for me on Ernie Co-vax, the UCB ! 679: Computer Science Department VAX machine, where this document was prepared. ! 680: This can be very useful if you have used ! 681: .I cd ! 682: to change to another directory and have found a file you wish to ! 683: copy using ! 684: .I cp. ! 685: If I give the command ! 686: .DS ! 687: cp thatfile ~ ! 688: .DE ! 689: the shell will expand this command to ! 690: .DS ! 691: cp thatfile /usr/bill ! 692: .DE ! 693: since my home directory is /usr/bill. ! 694: .PP ! 695: There also exists a mechanism using the characters `{' and `}' for ! 696: abbreviating a set of words which have common parts but cannot ! 697: be abbreviated by the above mechanisms because they are not files, ! 698: are the names of files which do not yet exist, ! 699: are not thus conveniently described. ! 700: This mechanism will be described much later, ! 701: in section 4.2, ! 702: as it is used less frequently. ! 703: .NH 2 ! 704: Quotation ! 705: .PP ! 706: We have already seen a number of metacharacters used by the shell. ! 707: These metacharacters pose a problem in that we cannot use them directly ! 708: as parts of words. ! 709: Thus the command ! 710: .DS ! 711: echo * ! 712: .DE ! 713: will not echo the character `*'. ! 714: It will either echo an sorted list of filenames in the ! 715: current ! 716: .I "working directory," ! 717: or print the message `No match' if there are ! 718: no files in the working directory. ! 719: .PP ! 720: The recommended mechanism for placing characters which are neither numbers, ! 721: digits, `/', `.' or `\-' in an argument word to a command is to enclose ! 722: it with single quotation characters `\'', i.e. ! 723: .DS ! 724: echo \'*\' ! 725: .DE ! 726: There is one special character `!' which is used by the ! 727: .I history ! 728: mechanism of the shell and which cannot be ! 729: .I escaped ! 730: by placing it within `\'' characters. ! 731: It and the character `\'' itself can be preceded by a single `\e' ! 732: to prevent their special meaning. ! 733: Thus ! 734: .DS ! 735: echo \e\'\e! ! 736: .DE ! 737: prints ! 738: .DS ! 739: \'! ! 740: .DE ! 741: These two mechanisms suffice to place any printing character into a word ! 742: which is an argument to a shell command. They can be combined, as in ! 743: .DS ! 744: echo \e\'\'*\' ! 745: .DE ! 746: which prints ! 747: .DS ! 748: \'* ! 749: .DE ! 750: since the first `\e' escaped the first `\'' and the `*' was enclosed ! 751: between `\'' characters. ! 752: .NH 2 ! 753: Terminating commands ! 754: .PP ! 755: When you are executing a command and the shell is ! 756: waiting for it to complete there are several ways ! 757: to force it to stop. ! 758: For instance if you type the command ! 759: .DS ! 760: cat /etc/passwd ! 761: .DE ! 762: the system will print a copy of a list of all users of the system ! 763: on your terminal. ! 764: This is likely to continue for several minutes unless you stop it. ! 765: You can send an ! 766: \s-2INTERRUPT\s0 ! 767: .I signal ! 768: to the ! 769: .I cat ! 770: command by typing ^C on your terminal.* ! 771: .FS ! 772: *On some older Unix systems the \s-2DEL\s0 or \s-2RUBOUT\s0 key ! 773: has the same effect. "stty all" will tell you the INTR key value. ! 774: .FE ! 775: Since ! 776: .I cat ! 777: does not take any precautions to avoid or otherwise handle this signal ! 778: the ! 779: \s-2INTERRUPT\s0 ! 780: will cause it to terminate. ! 781: The shell notices that ! 782: .I cat ! 783: has terminated and prompts you again with `% '. ! 784: If you hit \s-2INTERRUPT\s0 again, the shell will just ! 785: repeat its prompt since it handles \s-2INTERRUPT\s0 signals ! 786: and chooses to continue to execute commands rather than terminating ! 787: like ! 788: .I cat ! 789: did, which would have the effect of logging you out. ! 790: .PP ! 791: Another way in which many programs terminate is when they get an end-of-file ! 792: from their standard input. ! 793: Thus the ! 794: .I mail ! 795: program in the first example above was terminated when we typed a ^D ! 796: which generates an end-of-file from the standard input. ! 797: The shell also terminates when it gets an end-of-file printing `logout'; ! 798: \s-2UNIX\s0 then logs you off the system. ! 799: Since this means that typing too many ^D's can accidentally log us off, ! 800: the shell has a mechanism for preventing this. ! 801: This ! 802: .I ignoreeof ! 803: option will be discussed in section 2.2. ! 804: .PP ! 805: If a command has its standard input redirected from a file, then it will ! 806: normally terminate when it reaches the end of this file. ! 807: Thus if we execute ! 808: .DS ! 809: mail bill < prepared.text ! 810: .DE ! 811: the mail command will terminate without our typing a ^D. ! 812: This is because it read to the end-of-file of our file ! 813: `prepared.text' in which we placed a message for `bill' with an editor program. ! 814: We could also have done ! 815: .DS ! 816: cat prepared.text \||\| mail bill ! 817: .DE ! 818: since the ! 819: .I cat ! 820: command would then have written the text through the pipe to the ! 821: standard input of the mail command. ! 822: When the ! 823: .I cat ! 824: command completed it would have terminated, ! 825: closing down the pipeline ! 826: and the ! 827: .I mail ! 828: command would have received an end-of-file from it and terminated. ! 829: Using a pipe here is more complicated than redirecting input ! 830: so we would more likely use the first form. ! 831: These commands could also have been stopped by sending an \s-2INTERRUPT\s0. ! 832: .PP ! 833: Another possibility for stopping a command is to suspend its execution ! 834: temporarily, with the possibility of continuing execution later. This is ! 835: done by sending a \s-2STOP\s0 signal via typing a ^Z. ! 836: This signal causes all commands running on the terminal ! 837: (usually one but more if a pipeline is executing) to become suspended. ! 838: The shell notices that the command(s) have been suspended, types ! 839: `Stopped' and then prompts for a new command. ! 840: The previously executing command has been suspended, but otherwise ! 841: unaffected by the \s-2STOP\s0 signal. Any other commands can be executed ! 842: while the original command remains suspended. The suspended command can ! 843: be continued using the ! 844: .I fg ! 845: command with no arguments. The shell will then retype the command ! 846: to remind you which command is being continued, and cause the command ! 847: to resume execution. Unless any input files in use by the suspended ! 848: command have been changed in the meantime, the suspension has no effect ! 849: whatsoever on the execution of the command. This feature can be very useful ! 850: during editing, when you need to look at another file before continuing. An ! 851: example of command suspension follows. ! 852: .DS ! 853: % mail harold ! 854: Someone just copied a big file into my directory and its name is ! 855: ^Z ! 856: Stopped ! 857: % ls ! 858: funnyfile ! 859: prog.c ! 860: prog.o ! 861: % jobs ! 862: .ta 1.75i ! 863: [1] + Stopped mail harold ! 864: % fg ! 865: mail harold ! 866: funnyfile. Do you know who did it? ! 867: EOT ! 868: % ! 869: .so tabs ! 870: .DE ! 871: In this example someone was sending a message to Harold and forgot the ! 872: name of the file he wanted to mention. The mail command was suspended ! 873: by typing ^Z. When the shell noticed that the mail program was ! 874: suspended, it typed `Stopped' and prompted for a new command. Then the ! 875: .I ls ! 876: command was typed to find out the name of the file. The ! 877: .I jobs ! 878: command was run to find out which command was suspended. At this time the ! 879: .I fg ! 880: command was typed to continue execution of the mail program. Input ! 881: to the mail program was then continued and ended with a ^D ! 882: which indicated the end of the message at which time the mail ! 883: program typed EOT. The ! 884: .I jobs ! 885: command will show which commands are suspended. ! 886: The ^Z should only be typed at the beginning of a line since ! 887: everything typed on the current line is discarded when a signal is sent ! 888: from the keyboard. This also happens on \s-2INTERRUPT\s0, and \s-2QUIT\s0 ! 889: signals. More information on ! 890: suspending jobs and controlling them is given in ! 891: section 2.6. ! 892: .PP ! 893: If you write or run programs which are not fully debugged then it may ! 894: be necessary to stop them somewhat ungracefully. ! 895: This can be done by sending them a \s-2QUIT\s0 ! 896: signal, sent by typing a ^\e. ! 897: This will usually provoke the shell to produce a message like: ! 898: .DS ! 899: Quit (Core dumped) ! 900: .DE ! 901: indicating that a file ! 902: `core' has been created containing information about the running program's ! 903: state when it terminated due to the \s-2QUIT\s0 signal. ! 904: You can examine this file yourself, or forward information to the ! 905: maintainer of the program telling him/her where the ! 906: .I "core file" ! 907: is. ! 908: .PP ! 909: If you run background commands (as explained in section 2.6) then these ! 910: commands will ignore \s-2INTERRUPT\s0 and \s-2QUIT\s0 signals at the ! 911: terminal. To stop them you must use the ! 912: .I kill ! 913: command. See section 2.6 for an example. ! 914: .PP ! 915: If you want to examine the output of a command without having it move ! 916: off the screen as the output of the ! 917: .DS ! 918: cat /etc/passwd ! 919: .DE ! 920: command will, you can use the command ! 921: .DS ! 922: more /etc/passwd ! 923: .DE ! 924: The ! 925: .I more ! 926: program pauses after each complete screenful and types `\-\-More\-\-' ! 927: at which point you can hit a space to get another screenful, a return ! 928: to get another line, a `?' to get some help on other commands, or a `q' to end the ! 929: .I more ! 930: program. You can also use more as a filter, i.e. ! 931: .DS ! 932: cat /etc/passwd | more ! 933: .DE ! 934: works just like the more simple more command above. ! 935: .PP ! 936: For stopping output of commands not involving ! 937: .I more ! 938: you can use the ! 939: ^S key to stop the typeout. The typeout will resume when you ! 940: hit ^Q or any other key, but ^Q is normally used because ! 941: it only restarts the output and does not become input to the program ! 942: which is running. This works well on low-speed terminals, but at 9600 ! 943: baud it is hard to type ^S and ^Q fast enough to paginate ! 944: the output nicely, and a program like ! 945: .I more ! 946: is usually used. ! 947: .PP ! 948: An additional possibility is to use the ^O flush output ! 949: character; when this character is typed, all output from the current ! 950: command is thrown away (quickly) until the next input read occurs ! 951: or until the next shell prompt. This can be used to allow a command ! 952: to complete without having to suffer through the output on a slow ! 953: terminal; ^O is a toggle, so flushing can be turned off by ! 954: typing ^O again while output is being flushed. ! 955: .NH 2 ! 956: What now? ! 957: .PP ! 958: We have so far seen a number of mechanisms of the shell and learned a lot ! 959: about the way in which it operates. ! 960: The remaining sections will go yet further into the internals of the ! 961: shell, but you will surely want to try using the ! 962: shell before you go any further. ! 963: To try it you can log in to \s-2UNIX\s0 and type the following ! 964: command to the system: ! 965: .DS ! 966: chsh myname /bin/csh ! 967: .DE ! 968: Here `myname' should be replaced by the name you typed to ! 969: the system prompt of `login:' to get onto the system. ! 970: Thus I would use `chsh bill /bin/csh'. ! 971: .B ! 972: You only have to do this once; it takes effect at next login. ! 973: .R ! 974: You are now ready to try using ! 975: .I csh. ! 976: .PP ! 977: Before you do the `chsh' command, the shell you are using when ! 978: you log into the system is `/bin/sh'. ! 979: In fact, much of the above discussion is applicable to `/bin/sh'. ! 980: The next section will introduce many features particular to ! 981: .I csh ! 982: so you should change your shell to ! 983: .I csh ! 984: before you begin reading it. ! 985: .bp
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.