|
|
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.2 6.1 (Berkeley) 5/23/86 ! 6: .\" ! 7: .nr H1 1 ! 8: .NH ! 9: Details on the shell for terminal users ! 10: .NH 2 ! 11: Shell startup and termination ! 12: .PP ! 13: When you login, the shell is started by the system in your ! 14: .I home ! 15: directory and begins by reading commands from a file ! 16: .I \&.cshrc ! 17: in this directory. ! 18: All shells which you may start during your terminal session will ! 19: read from this file. ! 20: We will later see what kinds of commands are usefully placed there. ! 21: For now we need not have this file and the shell does not complain about ! 22: its absence. ! 23: .PP ! 24: A ! 25: .I "login shell" , ! 26: executed after you login to the system, ! 27: will, after it reads commands from ! 28: .I \&.cshrc, ! 29: read commands from a file ! 30: .I \&.login ! 31: also in your home directory. ! 32: This file contains commands which you wish to do each time you login ! 33: to the \s-2UNIX\s0 system. ! 34: My ! 35: .I \&.login ! 36: file looks something like: ! 37: .DS ! 38: set ignoreeof ! 39: set mail=(/usr/spool/mail/bill) ! 40: echo "${prompt}users" ; users ! 41: alias ts \e ! 42: \'set noglob ; eval \`tset \-s \-m dialup:c100rv4pna \-m plugboard:?hp2621nl \!*\`\'; ! 43: ts; stty intr ^C kill ^U crt ! 44: set time=15 history=10 ! 45: msgs \-f ! 46: if (\-e $mail) then ! 47: echo "${prompt}mail" ! 48: mail ! 49: endif ! 50: .DE ! 51: .PP ! 52: This file contains several commands to be executed by \s-2UNIX\s0 ! 53: each time I login. ! 54: The first is a ! 55: .I set ! 56: command which is interpreted directly by the shell. It sets the shell ! 57: variable ! 58: .I ignoreeof ! 59: which causes the shell to not log me off if I hit ^D. Rather, ! 60: I use the ! 61: .I logout ! 62: command to log off of the system. ! 63: By setting the ! 64: .I mail ! 65: variable, I ask the shell to watch for incoming mail to me. Every 5 minutes ! 66: the shell looks for this file and tells me if more mail has arrived there. ! 67: An alternative to this is to put the command ! 68: .DS ! 69: biff y ! 70: .DE ! 71: in place of this ! 72: .I set; ! 73: this will cause me to be notified immediately when mail arrives, and to ! 74: be shown the first few lines of the new message. ! 75: .PP ! 76: Next I set the shell variable `time' to `15' causing the shell to automatically ! 77: print out statistics lines for commands which execute for at least 15 seconds ! 78: of \s-2CPU\s+2 time. The variable `history' is set to 10 indicating that ! 79: I want the shell to remember the last 10 commands I type in its ! 80: .I "history list" , ! 81: (described later). ! 82: .PP ! 83: I create an ! 84: .I alias ! 85: ``ts'' which executes a ! 86: \fItset\fR\|(1) command setting up the modes of the terminal. ! 87: The parameters to ! 88: .I tset ! 89: indicate the kinds of terminal which I usually use when not on a hardwired ! 90: port. I then execute ``ts'' and also use the ! 91: .I stty ! 92: command to change the interrupt character to ^C and the line kill ! 93: character to ^U. ! 94: .PP ! 95: I then run the `msgs' program, which provides me with any ! 96: system messages which I have not seen before; the `\-f' option here prevents ! 97: it from telling me anything if there are no new messages. ! 98: Finally, if my mailbox file exists, then I run the `mail' program to ! 99: process my mail. ! 100: .PP ! 101: When the `mail' and `msgs' programs finish, the shell will finish ! 102: processing my ! 103: .I \&.login ! 104: file and begin reading commands from the terminal, prompting for each with ! 105: `% '. ! 106: When I log off (by giving the ! 107: .I logout ! 108: command) the shell ! 109: will print `logout' and execute commands from the file `.logout' ! 110: if it exists in my home directory. ! 111: After that the shell will terminate and \s-2UNIX\s0 will log ! 112: me off the system. ! 113: If the system is not going down, I will receive a new login message. ! 114: In any case, after the `logout' message the shell is committed to terminating ! 115: and will take no further input from my terminal. ! 116: .NH 2 ! 117: Shell variables ! 118: .PP ! 119: The shell maintains a set of ! 120: .I variables. ! 121: We saw above the variables ! 122: .I history ! 123: and ! 124: .I time ! 125: which had values `10' and `15'. ! 126: In fact, each shell variable has as value an array of ! 127: zero or more ! 128: .I strings. ! 129: Shell variables may be assigned values by the set command. It has ! 130: several forms, the most useful of which was given above and is ! 131: .DS ! 132: set name=value ! 133: .DE ! 134: .PP ! 135: Shell variables may be used to store values which are to ! 136: be used in commands later through a substitution mechanism. ! 137: The shell variables most commonly referenced are, however, those which the ! 138: shell itself refers to. ! 139: By changing the values of these variables one can directly affect the ! 140: behavior of the shell. ! 141: .PP ! 142: One of the most important variables is the variable ! 143: .I path. ! 144: This variable contains a sequence of directory names where the shell ! 145: searches for commands. ! 146: The ! 147: .I set ! 148: command with no arguments ! 149: shows the value of all variables currently defined (we usually say ! 150: .I set) ! 151: in the shell. ! 152: The default value for path will be shown by ! 153: .I set ! 154: to be ! 155: .DS ! 156: % set ! 157: .ta .75i ! 158: argv () ! 159: cwd /usr/bill ! 160: home /usr/bill ! 161: path (. /usr/ucb /bin /usr/bin) ! 162: prompt % ! 163: shell /bin/csh ! 164: status 0 ! 165: term c100rv4pna ! 166: user bill ! 167: % ! 168: .so tabs ! 169: .DE ! 170: This output indicates that the variable path points to the current ! 171: directory `.' and then `/usr/ucb', `/bin' and `/usr/bin'. ! 172: Commands which you may write might be in `.' (usually one of ! 173: your directories). ! 174: Commands developed at Berkeley, live in `/usr/ucb' ! 175: while commands developed at Bell Laboratories live in `/bin' and `/usr/bin'. ! 176: .PP ! 177: A number of locally developed programs on the system live in the directory ! 178: `/usr/local'. ! 179: If we wish that all shells which we invoke to have ! 180: access to these new programs we can place the command ! 181: .DS ! 182: set path=(. /usr/ucb /bin /usr/bin /usr/local) ! 183: .DE ! 184: in our file ! 185: .I \&.cshrc ! 186: in our home directory. ! 187: Try doing this and then logging out and back in and do ! 188: .DS ! 189: set ! 190: .DE ! 191: again to see that the value assigned to ! 192: .I path ! 193: has changed. ! 194: .FS \(dg ! 195: Another directory that might interest you is /usr/new, which contains ! 196: many useful user-contributed programs provided with Berkeley Unix. ! 197: .FE ! 198: .PP ! 199: One thing you should be aware of is that the shell examines each directory ! 200: which you insert into your path and determines which commands are contained ! 201: there. Except for the current directory `.', which the shell treats specially, ! 202: this means that if commands are added to a directory in your search path after ! 203: you have started the shell, they will not necessarily be found by the shell. ! 204: If you wish to use a command which has been added in this way, you should ! 205: give the command ! 206: .DS ! 207: rehash ! 208: .DE ! 209: to the shell, which will cause it to recompute its internal table of command ! 210: locations, so that it will find the newly added command. ! 211: Since the shell has to look in the current directory `.' on each command, ! 212: placing it at the end of the path specification usually works equivalently ! 213: and reduces overhead. ! 214: .PP ! 215: Other useful built in variables are the variable ! 216: .I home ! 217: which shows your home directory, ! 218: .I cwd ! 219: which contains your current working directory, ! 220: the variable ! 221: .I ignoreeof ! 222: which can be set in your ! 223: .I \&.login ! 224: file to tell the shell not to exit when it receives an end-of-file from ! 225: a terminal (as described above). ! 226: The variable `ignoreeof' ! 227: is one of several variables which the shell does not care about the ! 228: value of, only whether they are ! 229: .I set ! 230: or ! 231: .I unset. ! 232: Thus to set this variable you simply do ! 233: .DS ! 234: set ignoreeof ! 235: .DE ! 236: and to unset it do ! 237: .DS ! 238: unset ignoreeof ! 239: .DE ! 240: These give the variable `ignoreeof' no value, but none is desired or required. ! 241: .PP ! 242: Finally, some other built-in shell variables of use are the ! 243: variables ! 244: .I noclobber ! 245: and ! 246: .I mail. ! 247: The metasyntax ! 248: .DS ! 249: > filename ! 250: .DE ! 251: which redirects the standard output of a command ! 252: will overwrite and destroy the previous contents of the named file. ! 253: In this way you may accidentally overwrite a file which is valuable. ! 254: If you would prefer that the shell not overwrite files in this ! 255: way you can ! 256: .DS ! 257: set noclobber ! 258: .DE ! 259: in your ! 260: .I \&.login ! 261: file. ! 262: Then trying to do ! 263: .DS ! 264: date > now ! 265: .DE ! 266: would cause a diagnostic if `now' existed already. ! 267: You could type ! 268: .DS ! 269: date >! now ! 270: .DE ! 271: if you really wanted to overwrite the contents of `now'. ! 272: The `>!' is a special metasyntax indicating that clobbering the ! 273: file is ok.\(dg ! 274: .FS ! 275: \(dgThe space between the `!' and the word `now' is critical here, as `!now' ! 276: would be an invocation of the ! 277: .I history ! 278: mechanism, and have a totally different effect. ! 279: .FE ! 280: .NH 2 ! 281: The shell's history list ! 282: .PP ! 283: The shell can maintain a ! 284: .I "history list" ! 285: into which it places the words ! 286: of previous commands. ! 287: It is possible to use a notation to reuse commands or words ! 288: from commands in forming new commands. ! 289: This mechanism can be used to repeat previous commands or to ! 290: correct minor typing mistakes in commands. ! 291: .PP ! 292: The following figure gives a sample session involving typical usage of the ! 293: history mechanism of the shell. ! 294: .KF ! 295: .DS ! 296: % cat bug.c ! 297: main() ! 298: ! 299: { ! 300: printf("hello); ! 301: } ! 302: % cc !$ ! 303: cc bug.c ! 304: "bug.c", line 4: newline in string or char constant ! 305: "bug.c", line 5: syntax error ! 306: % ed !$ ! 307: ed bug.c ! 308: 29 ! 309: 4s/);/"&/p ! 310: printf("hello"); ! 311: w ! 312: 30 ! 313: q ! 314: % !c ! 315: cc bug.c ! 316: % a.out ! 317: hello% !e ! 318: ed bug.c ! 319: 30 ! 320: 4s/lo/lo\e\en/p ! 321: printf("hello\en"); ! 322: w ! 323: 32 ! 324: q ! 325: % !c \-o bug ! 326: cc bug.c \-o bug ! 327: % size a.out bug ! 328: a.out: 2784+364+1028 = 4176b = 0x1050b ! 329: bug: 2784+364+1028 = 4176b = 0x1050b ! 330: % ls \-l !* ! 331: ls \-l a.out bug ! 332: \(mirwxr\(mixr\(mix 1 bill 3932 Dec 19 09:41 a.out ! 333: \(mirwxr\(mixr\(mix 1 bill 3932 Dec 19 09:42 bug ! 334: % bug ! 335: hello ! 336: % num bug.c | spp ! 337: spp: Command not found. ! 338: % ^spp^ssp ! 339: num bug.c | ssp ! 340: 1 main() ! 341: 3 { ! 342: 4 printf("hello\en"); ! 343: 5 } ! 344: % !! | lpr ! 345: num bug.c | ssp | lpr ! 346: % ! 347: .DE ! 348: .KE ! 349: In this example we have a very simple C program which has a bug (or two) ! 350: in it in the file `bug.c', which we `cat' out on our terminal. We then ! 351: try to run the C compiler on it, referring to the file again as `!$', ! 352: meaning the last argument to the previous command. Here the `!' is the ! 353: history mechanism invocation metacharacter, and the `$' stands for the last ! 354: argument, by analogy to `$' in the editor which stands for the end of the line. ! 355: The shell echoed the command, as it would have been typed without use of ! 356: the history mechanism, and then executed it. ! 357: The compilation yielded error diagnostics so we now run the editor on the ! 358: file we were trying to compile, fix the bug, and run the C compiler again, ! 359: this time referring to this command simply as `!c', which repeats the last ! 360: command which started with the letter `c'. If there were other ! 361: commands starting with `c' done recently we could have said `!cc' or even ! 362: `!cc:p' which would have printed the last command starting with `cc' ! 363: without executing it. ! 364: .PP ! 365: After this recompilation, we ran the resulting `a.out' file, and then ! 366: noting that there still was a bug, ran the editor again. After fixing ! 367: the program we ran the C compiler again, but tacked onto the command ! 368: an extra `\-o bug' telling the compiler to place the resultant binary in ! 369: the file `bug' rather than `a.out'. In general, the history mechanisms ! 370: may be used anywhere in the formation of new commands and other characters ! 371: may be placed before and after the substituted commands. ! 372: .PP ! 373: We then ran the `size' command to see how large the binary program images ! 374: we have created were, and then an `ls \-l' command with the same argument ! 375: list, denoting the argument list `\!*'. ! 376: Finally we ran the program `bug' to see that its output is indeed correct. ! 377: .PP ! 378: To make a numbered listing of the program we ran the `num' command on the file `bug.c'. ! 379: In order to compress out blank lines in the output of `num' we ran the ! 380: output through the filter `ssp', but misspelled it as spp. To correct this ! 381: we used a shell substitute, placing the old text and new text between `^' ! 382: characters. This is similar to the substitute command in the editor. ! 383: Finally, we repeated the same command with `!!', but sent its output to the ! 384: line printer. ! 385: .PP ! 386: There are other mechanisms available for repeating commands. The ! 387: .I history ! 388: command prints out a number of previous commands with numbers by which ! 389: they can be referenced. There is a way to refer to a previous command ! 390: by searching for a string which appeared in it, and there are other, ! 391: less useful, ways to select arguments to include in a new command. ! 392: A complete description of all these mechanisms ! 393: is given in the C shell manual pages in the \s-2UNIX\s0 Programmer's Manual. ! 394: .NH 2 ! 395: Aliases ! 396: .PP ! 397: The shell has an ! 398: .I alias ! 399: mechanism which can be used to make transformations on input commands. ! 400: This mechanism can be used to simplify the commands you type, ! 401: to supply default arguments to commands, ! 402: or to perform transformations on commands and their arguments. ! 403: The alias facility is similar to a macro facility. ! 404: Some of the features obtained by aliasing can be obtained also ! 405: using shell command files, but these take place in another instance ! 406: of the shell and cannot directly affect the current shells environment ! 407: or involve commands such as ! 408: .I cd ! 409: which must be done in the current shell. ! 410: .PP ! 411: As an example, suppose that there is a new version of the mail program ! 412: on the system called `newmail' ! 413: you wish to use, rather than the standard mail program which is called ! 414: `mail'. ! 415: If you place the shell command ! 416: .DS ! 417: alias mail newmail ! 418: .DE ! 419: in your ! 420: .I \&.cshrc ! 421: file, the shell will transform an input line of the form ! 422: .DS ! 423: mail bill ! 424: .DE ! 425: into a call on `newmail'. ! 426: More generally, suppose we wish the command `ls' to always show ! 427: sizes of files, that is to always do `\-s'. ! 428: We can do ! 429: .DS ! 430: alias ls ls \-s ! 431: .DE ! 432: or even ! 433: .DS ! 434: alias dir ls \-s ! 435: .DE ! 436: creating a new command syntax `dir' ! 437: which does an `ls \-s'. ! 438: If we say ! 439: .DS ! 440: dir ~bill ! 441: .DE ! 442: then the shell will translate this to ! 443: .DS ! 444: ls \-s /mnt/bill ! 445: .DE ! 446: .PP ! 447: Thus the ! 448: .I alias ! 449: mechanism can be used to provide short names for commands, ! 450: to provide default arguments, ! 451: and to define new short commands in terms of other commands. ! 452: It is also possible to define aliases which contain multiple ! 453: commands or pipelines, showing where the arguments to the original ! 454: command are to be substituted using the facilities of the ! 455: history mechanism. ! 456: Thus the definition ! 457: .DS ! 458: alias cd \'cd \e!* ; ls \' ! 459: .DE ! 460: would do an ! 461: .I ls ! 462: command after each change directory ! 463: .I cd ! 464: command. ! 465: We enclosed the entire alias definition in `\'' characters to prevent ! 466: most substitutions from occurring and the character `;' from being ! 467: recognized as a metacharacter. ! 468: The `!' here is escaped with a `\e' to prevent it from being interpreted ! 469: when the alias command is typed in. ! 470: The `\e!*' here substitutes the entire argument list to the pre-aliasing ! 471: .I cd ! 472: command, without giving an error if there were no arguments. ! 473: The `;' separating commands is used here ! 474: to indicate that one command is to be done and then the next. ! 475: Similarly the definition ! 476: .DS ! 477: alias whois \'grep \e!^ /etc/passwd\' ! 478: .DE ! 479: defines a command which looks up its first argument in the password file. ! 480: .PP ! 481: .B Warning: ! 482: The shell currently reads the ! 483: .I \&.cshrc ! 484: file each time it starts up. If you place a large number of commands ! 485: there, shells will tend to start slowly. A mechanism for saving the shell ! 486: environment after reading the \fI\&.cshrc\fR file and quickly restoring it is ! 487: under development, but for now you should try to limit the number of ! 488: aliases you have to a reasonable number... 10 or 15 is reasonable, ! 489: 50 or 60 will cause a noticeable delay in starting up shells, and make ! 490: the system seem sluggish when you execute commands from within the editor ! 491: and other programs. ! 492: .NH 2 ! 493: More redirection; >> and >& ! 494: .PP ! 495: There are a few more notations useful to the terminal user ! 496: which have not been introduced yet. ! 497: .PP ! 498: In addition to the standard output, commands also have a ! 499: .I "diagnostic output" ! 500: which is normally directed to the terminal even when the standard output ! 501: is redirected to a file or a pipe. ! 502: It is occasionally desirable to direct the diagnostic output along with ! 503: the standard output. ! 504: For instance if you want to redirect the output of a long running command ! 505: into a file and wish to have a record of any error diagnostic it produces ! 506: you can do ! 507: .DS ! 508: command >& file ! 509: .DE ! 510: The `>&' here tells the shell to route both the diagnostic output and the ! 511: standard output into `file'. ! 512: Similarly you can give the command ! 513: .DS ! 514: command |\|& lpr ! 515: .DE ! 516: to route both standard and diagnostic output through the pipe ! 517: to the line printer daemon ! 518: .I lpr.\(dd ! 519: .FS ! 520: \(dd A command of the form ! 521: .br ! 522: .ti +5 ! 523: command >&! file ! 524: .br ! 525: exists, and is used when ! 526: .I noclobber ! 527: is set and ! 528: .I file ! 529: already exists. ! 530: .FE ! 531: .PP ! 532: Finally, it is possible to use the form ! 533: .DS ! 534: command >> file ! 535: .DE ! 536: to place output at the end of an existing file.\(dg ! 537: .FS ! 538: \(dg If ! 539: .I noclobber ! 540: is set, then an error will result if ! 541: .I file ! 542: does not exist, otherwise the shell will create ! 543: .I file ! 544: if it doesn't exist. ! 545: A form ! 546: .br ! 547: .ti +5 ! 548: command >>! file ! 549: .br ! 550: makes it not be an error for file to not exist when ! 551: .I noclobber ! 552: is set. ! 553: .FE ! 554: .NH 2 ! 555: Jobs; Background, Foreground, or Suspended ! 556: .PP ! 557: When one or more commands ! 558: are typed together as a pipeline or as a sequence of commands separated by ! 559: semicolons, a single ! 560: .I job ! 561: is created by the shell consisting of these commands together as a unit. ! 562: Single commands without pipes or semicolons create the simplest jobs. ! 563: Usually, every line typed to the shell creates a job. ! 564: Some lines that create jobs (one per line) are ! 565: .DS ! 566: sort < data ! 567: ls \-s | sort \-n | head \-5 ! 568: mail harold ! 569: .DE ! 570: .PP ! 571: If the metacharacter `&' is typed ! 572: at the end of the commands, then the job is started as a ! 573: .I background ! 574: job. This means that the shell does not wait for it to complete but ! 575: immediately prompts and is ready for another command. The job runs ! 576: .I "in the background" ! 577: at the same time that normal jobs, called ! 578: .I foreground ! 579: jobs, continue to be read and executed by the shell one at a time. ! 580: Thus ! 581: .DS ! 582: du > usage & ! 583: .DE ! 584: would run the ! 585: .I du ! 586: program, which reports on the disk usage of your working directory (as well as ! 587: any directories below it), put the output into the file `usage' and return ! 588: immediately with a prompt for the next command without out waiting for ! 589: .I du ! 590: to finish. The ! 591: .I du ! 592: program would continue executing in the background ! 593: until it finished, even though you can type and execute more commands in the ! 594: mean time. ! 595: When a background ! 596: job terminates, a message is typed by the shell just before the next prompt ! 597: telling you that the job has completed. ! 598: In the following example the ! 599: .I du ! 600: job finishes sometime during the ! 601: execution of the ! 602: .I mail ! 603: command and its completion is reported just before ! 604: the prompt after the ! 605: .I mail ! 606: job is finished. ! 607: .DS ! 608: % du > usage & ! 609: [1] 503 ! 610: % mail bill ! 611: How do you know when a background job is finished? ! 612: EOT ! 613: .ta 1.75i ! 614: [1] \- Done du > usage ! 615: % ! 616: .so tabs ! 617: .DE ! 618: If the job did not terminate normally the `Done' message might say ! 619: something else like `Killed'. ! 620: If you want the ! 621: terminations of background jobs to be reported at the time they occur ! 622: (possibly interrupting the output of other foreground jobs), you can set ! 623: the ! 624: .I notify ! 625: variable. In the previous example this would mean that the ! 626: `Done' message might have come right in the middle of the message to ! 627: Bill. ! 628: Background jobs are unaffected by any signals from the keyboard like ! 629: the \s-2STOP\s0, \s-2INTERRUPT\s0, or \s-2QUIT\s0 signals mentioned earlier. ! 630: .PP ! 631: Jobs are recorded in a table inside the shell until they terminate. ! 632: In this table, the shell remembers the command names, arguments and the ! 633: .I "process numbers" ! 634: of all commands in the job as well as the working directory where the job was ! 635: started. ! 636: Each job in the table is either running ! 637: .I "in the foreground" ! 638: with the shell waiting for it to terminate, running ! 639: .I "in the background," ! 640: or ! 641: .I suspended. ! 642: Only one job can be running in the foreground at one time, but several ! 643: jobs can be suspended or running in the background at once. As each job ! 644: is started, it is assigned a small identifying ! 645: number called the ! 646: .I "job number" ! 647: which can be used later to refer to the job in the commands described below. ! 648: Job numbers remain ! 649: the same until the job terminates and then are re-used. ! 650: .PP ! 651: When a job is started in the backgound using `&', its number, as well ! 652: as the process numbers of all its (top level) commands, is typed by the shell ! 653: before prompting you for another command. For example, ! 654: .DS ! 655: % ls \-s | sort \-n > usage & ! 656: [2] 2034 2035 ! 657: % ! 658: .DE ! 659: runs the `ls' program with the `\-s' options, pipes this output into ! 660: the `sort' program with the `\-n' option which puts its output into the ! 661: file `usage'. ! 662: Since the `&' was at the end of the line, these two programs were started ! 663: together as a background job. After starting the job, the shell prints ! 664: the job number in brackets (2 in this case) followed by the process number ! 665: of each program started in the job. Then the shell immediates prompts for ! 666: a new command, leaving the job running simultaneously. ! 667: .PP ! 668: As mentioned in section 1.8, foreground jobs become ! 669: .I suspended ! 670: by typing ^Z ! 671: which sends a \s-2STOP\s0 signal to the currently running ! 672: foreground job. A background job can become suspended by using the ! 673: .I stop ! 674: command described below. When jobs are suspended they merely stop ! 675: any further progress until started again, either in the foreground ! 676: or the backgound. The shell notices when a job becomes stopped and ! 677: reports this fact, much like it reports the termination of background jobs. ! 678: For foreground jobs this looks like ! 679: .DS ! 680: % du > usage ! 681: ^Z ! 682: Stopped ! 683: % ! 684: .DE ! 685: `Stopped' message is typed by the shell when it notices that the ! 686: .I du ! 687: program stopped. ! 688: For background jobs, using the ! 689: .I stop ! 690: command, it is ! 691: .DS ! 692: % sort usage & ! 693: [1] 2345 ! 694: % stop %1 ! 695: .ta 1.75i ! 696: [1] + Stopped (signal) sort usage ! 697: % ! 698: .so tabs ! 699: .DE ! 700: Suspending foreground jobs can be very useful when you need to temporarily ! 701: change what you are doing (execute other commands) and then return to ! 702: the suspended job. Also, foreground jobs can be suspended and then ! 703: continued as background jobs using the ! 704: .I bg ! 705: command, allowing you to continue other work and ! 706: stop waiting for the foreground job to finish. Thus ! 707: .DS ! 708: % du > usage ! 709: ^Z ! 710: Stopped ! 711: % bg ! 712: [1] du > usage & ! 713: % ! 714: .DE ! 715: starts `du' in the foreground, stops it before it finishes, then continues ! 716: it in the background allowing more foreground commands to be executed. ! 717: This is especially helpful ! 718: when a foreground job ends up taking longer than you expected and you ! 719: wish you had started it in the backgound in the beginning. ! 720: .PP ! 721: All ! 722: .I "job control" ! 723: commands can take an argument that identifies a particular ! 724: job. ! 725: All job name arguments begin with the character `%', since some of the ! 726: job control commands also accept process numbers (printed by the ! 727: .I ps ! 728: command.) ! 729: The default job (when no argument is given) is called the ! 730: .I current ! 731: job and is identified by a `+' in the output of the ! 732: .I jobs ! 733: command, which shows you which jobs you have. ! 734: When only one job is stopped or running in the background (the usual case) ! 735: it is always the current job thus no argument is needed. ! 736: If a job is stopped while running in the foreground it becomes the ! 737: .I current ! 738: job and the existing current job becomes the ! 739: .I previous ! 740: job \- identified by a `\-' in the output of ! 741: .I jobs. ! 742: When the current job terminates, the previous job becomes the current job. ! 743: When given, the argument is either `%\-' (indicating ! 744: the previous job); `%#', where # is the job number; ! 745: `%pref' where pref is some unique prefix of the command name ! 746: and arguments of one of the jobs; or `%?' followed by some string found ! 747: in only one of the jobs. ! 748: .PP ! 749: The ! 750: .I jobs ! 751: command types the table of jobs, giving the job number, ! 752: commands and status (`Stopped' or `Running') of each backgound or ! 753: suspended job. With the `\-l' option the process numbers are also ! 754: typed. ! 755: .DS ! 756: % du > usage & ! 757: [1] 3398 ! 758: % ls \-s | sort \-n > myfile & ! 759: [2] 3405 ! 760: % mail bill ! 761: ^Z ! 762: Stopped ! 763: % jobs ! 764: .ta 1.75i ! 765: [1] \(mi Running du > usage ! 766: [2] Running ls \-s | sort \-n > myfile ! 767: [3] \(pl Stopped mail bill ! 768: % fg %ls ! 769: ls \-s | sort \-n > myfile ! 770: % more myfile ! 771: .so tabs ! 772: .DE ! 773: .PP ! 774: The ! 775: .I fg ! 776: command runs a suspended or background job in the foreground. It is ! 777: used to restart a previously suspended job or change a background job ! 778: to run in the foreground (allowing signals or input from the terminal). ! 779: In the above example we used ! 780: .I fg ! 781: to change the `ls' job from the ! 782: background to the foreground since we wanted to wait for it to ! 783: finish before looking at its output file. ! 784: The ! 785: .I bg ! 786: command runs a suspended job in the background. It is usually used ! 787: after stopping the currently running foreground job with the ! 788: \s-2STOP\s0 signal. The combination of the \s-2STOP\s0 signal and the ! 789: .I bg ! 790: command changes a foreground job into a background job. ! 791: The ! 792: .I stop ! 793: command suspends a background job. ! 794: .PP ! 795: The ! 796: .I kill ! 797: command terminates a background or suspended job immediately. ! 798: In addition to jobs, it may be given process numbers as arguments, ! 799: as printed by ! 800: .I ps. ! 801: Thus, in the example above, the running ! 802: .I du ! 803: command could have been terminated by the command ! 804: .DS ! 805: % kill %1 ! 806: .ta 1.75i ! 807: [1] Terminated du > usage ! 808: % ! 809: .so tabs ! 810: .DE ! 811: .PP ! 812: The ! 813: .I notify ! 814: command (not the variable mentioned earlier) indicates that the termination ! 815: of a specific job should be ! 816: reported at the time it finishes instead of waiting for the next prompt. ! 817: .PP ! 818: If a job running in the background tries to read input from the terminal ! 819: it is automatically stopped. When such a job is then run in the ! 820: foreground, input can be given to the job. If desired, the job can ! 821: be run in the background again until it requests input again. ! 822: This is illustrated in the following sequence where the `s' command in the ! 823: text editor might take a long time. ! 824: .ID ! 825: .nf ! 826: % ed bigfile ! 827: 120000 ! 828: 1,$s/thisword/thatword/ ! 829: ^Z ! 830: Stopped ! 831: % bg ! 832: [1] ed bigfile & ! 833: % ! 834: . . . some foreground commands ! 835: .ta 1.75i ! 836: [1] Stopped (tty input) ed bigfile ! 837: % fg ! 838: ed bigfile ! 839: w ! 840: 120000 ! 841: q ! 842: % ! 843: .so tabs ! 844: .DE ! 845: So after the `s' command was issued, the `ed' job was stopped with ^Z ! 846: and then put in the background using ! 847: .I bg. ! 848: Some time later when the `s' command was finished, ! 849: .I ed ! 850: tried to read another command and was stopped because jobs ! 851: in the backgound cannot read from the terminal. The ! 852: .I fg ! 853: command returned the `ed' job to the foreground where it could once again ! 854: accept commands from the terminal. ! 855: .PP ! 856: The command ! 857: .DS ! 858: stty tostop ! 859: .DE ! 860: causes all background jobs run on your terminal to stop ! 861: when they are about to ! 862: write output to the terminal. This prevents messages from background ! 863: jobs from interrupting foreground job output and allows you to run ! 864: a job in the background without losing terminal output. It also ! 865: can be used for interactive programs that sometimes have long ! 866: periods without interaction. Thus each time it outputs a prompt for more ! 867: input it will stop before the prompt. It can then be run in the ! 868: foreground using ! 869: .I fg, ! 870: more input can be given and, if necessary stopped and returned to ! 871: the background. This ! 872: .I stty ! 873: command might be a good thing to put in your ! 874: .I \&.login ! 875: file if you do not like output from background jobs interrupting ! 876: your work. It also can reduce the need for redirecting the output ! 877: of background jobs if the output is not very big: ! 878: .DS ! 879: % stty tostop ! 880: % wc hugefile & ! 881: [1] 10387 ! 882: % ed text ! 883: \&. . . some time later ! 884: q ! 885: .ta 1.75i ! 886: [1] Stopped (tty output) wc hugefile ! 887: % fg wc ! 888: wc hugefile ! 889: 13371 30123 302577 ! 890: % stty \-tostop ! 891: .so tabs ! 892: .DE ! 893: Thus after some time the `wc' command, which counts the lines, words ! 894: and characters in a file, had one line of output. When it tried to ! 895: write this to the terminal it stopped. By restarting it in the ! 896: foreground we allowed it to write on the terminal exactly when we were ! 897: ready to look at its output. ! 898: Programs which attempt to change the mode of the terminal will also ! 899: block, whether or not ! 900: .I tostop ! 901: is set, when they are not in the foreground, as ! 902: it would be very unpleasant to have a background job change the state ! 903: of the terminal. ! 904: .PP ! 905: Since the ! 906: .I jobs ! 907: command only prints jobs started in the currently executing shell, ! 908: it knows nothing about background jobs started in other login sessions ! 909: or within shell files. The ! 910: .I ps ! 911: can be used in this case to find out about background jobs not started ! 912: in the current shell. ! 913: .NH 2 ! 914: Working Directories ! 915: .PP ! 916: As mentioned in section 1.6, the shell is always in a particular ! 917: .I "working directory." ! 918: The `change directory' command ! 919: .I chdir ! 920: (its ! 921: short form ! 922: .I cd ! 923: may also be used) ! 924: changes the working directory of the shell, ! 925: that is, changes the directory you ! 926: are located in. ! 927: .PP ! 928: It is useful to make a directory for each project you wish to work on ! 929: and to place all files related to that project in that directory. ! 930: The `make directory' command, ! 931: .I mkdir, ! 932: creates a new directory. ! 933: The ! 934: .I pwd ! 935: (`print working directory') command ! 936: reports the absolute pathname of the working directory of the shell, ! 937: that is, the directory you are ! 938: located in. ! 939: Thus in the example below: ! 940: .DS ! 941: % pwd ! 942: /usr/bill ! 943: % mkdir newpaper ! 944: % chdir newpaper ! 945: % pwd ! 946: /usr/bill/newpaper ! 947: % ! 948: .DE ! 949: the user has created and moved to the ! 950: directory ! 951: .I newpaper. ! 952: where, for example, he might ! 953: place a group of related files. ! 954: .PP ! 955: No matter where you have moved to in a directory hierarchy, ! 956: you can return to your `home' login directory by doing just ! 957: .DS ! 958: cd ! 959: .DE ! 960: with no arguments. ! 961: The name `..' always means the directory above the current one in ! 962: the hierarchy, thus ! 963: .DS ! 964: cd .. ! 965: .DE ! 966: changes the shell's working directory to the one directly above the ! 967: current one. ! 968: The name `..' can be used in any ! 969: pathname, thus, ! 970: .DS ! 971: cd ../programs ! 972: .DE ! 973: means ! 974: change to the directory `programs' contained in the directory ! 975: above the current one. ! 976: If you have several directories for different ! 977: projects under, say, your home directory, ! 978: this shorthand notation ! 979: permits you to switch easily between them. ! 980: .PP ! 981: The shell always remembers the pathname of its current working directory in ! 982: the variable ! 983: .I cwd. ! 984: The shell can also be requested to remember the previous directory when ! 985: you change to a new working directory. If the `push directory' command ! 986: .I pushd ! 987: is used in place of the ! 988: .I cd ! 989: command, the shell saves the name of the current working directory ! 990: on a ! 991: .I "directory stack" ! 992: before changing to the new one. ! 993: You can see this list at any time by typing the `directories' ! 994: command ! 995: .I dirs. ! 996: .ID ! 997: .nf ! 998: % pushd newpaper/references ! 999: ~/newpaper/references ~ ! 1000: % pushd /usr/lib/tmac ! 1001: /usr/lib/tmac ~/newpaper/references ~ ! 1002: % dirs ! 1003: /usr/lib/tmac ~/newpaper/references ~ ! 1004: % popd ! 1005: ~/newpaper/references ~ ! 1006: % popd ! 1007: ~ ! 1008: % ! 1009: .DE ! 1010: The list is printed in a horizontal line, reading left to right, ! 1011: with a tilde (~) as ! 1012: shorthand for your home directory\(emin this case `/usr/bill'. ! 1013: The directory stack is printed whenever there is more than one ! 1014: entry on it and it changes. ! 1015: It is also printed by a ! 1016: .I dirs ! 1017: command. ! 1018: .I Dirs ! 1019: is usually faster and more informative than ! 1020: .I pwd ! 1021: since it shows the current working directory as well as any ! 1022: other directories remembered in the stack. ! 1023: .PP ! 1024: The ! 1025: .I pushd ! 1026: command with no argument ! 1027: alternates the current directory with the first directory in the ! 1028: list. ! 1029: The `pop directory' ! 1030: .I popd ! 1031: command without an argument returns you to the directory you were in prior to ! 1032: the current one, discarding the previous current directory from the ! 1033: stack (forgetting it). ! 1034: Typing ! 1035: .I popd ! 1036: several times in a series takes you backward through the directories ! 1037: you had been in (changed to) by ! 1038: .I pushd ! 1039: command. ! 1040: There are other options to ! 1041: .I pushd ! 1042: and ! 1043: .I popd ! 1044: to manipulate the contents of the directory stack and to change ! 1045: to directories not at the top of the stack; see the ! 1046: .I csh ! 1047: manual page for details. ! 1048: .PP ! 1049: Since the shell remembers the working directory in which each job ! 1050: was started, it warns you when you might be confused by restarting ! 1051: a job in the foreground which has a different working directory than the ! 1052: current working directory of the shell. Thus if you start a background ! 1053: job, then change the shell's working directory and then cause the ! 1054: background job to run in the foreground, the shell warns you that the ! 1055: working directory of the currently running foreground job is different ! 1056: from that of the shell. ! 1057: .DS ! 1058: % dirs \-l ! 1059: /mnt/bill ! 1060: % cd myproject ! 1061: % dirs ! 1062: ~/myproject ! 1063: % ed prog.c ! 1064: 1143 ! 1065: ^Z ! 1066: Stopped ! 1067: % cd .. ! 1068: % ls ! 1069: myproject ! 1070: textfile ! 1071: % fg ! 1072: ed prog.c (wd: ~/myproject) ! 1073: .DE ! 1074: This way the shell warns you when there ! 1075: is an implied change of working directory, even though no cd command was ! 1076: issued. In the above example the `ed' job was still in `/mnt/bill/project' ! 1077: even though the shell had changed to `/mnt/bill'. ! 1078: A similar warning is given when such a foreground job ! 1079: terminates or is suspended (using the \s-2STOP\s0 signal) since ! 1080: the return to the shell again implies a change of working directory. ! 1081: .DS ! 1082: % fg ! 1083: ed prog.c (wd: ~/myproject) ! 1084: . . . after some editing ! 1085: q ! 1086: (wd now: ~) ! 1087: % ! 1088: .DE ! 1089: These messages are sometimes confusing if you use programs that change ! 1090: their own working directories, since the shell only remembers which ! 1091: directory a job is started in, and assumes it stays there. ! 1092: The `\-l' option of ! 1093: .I jobs ! 1094: will type the working directory ! 1095: of suspended or background jobs when it is different ! 1096: from the current working directory of the shell. ! 1097: .NH 2 ! 1098: Useful built-in commands ! 1099: .PP ! 1100: We now give a few of the useful built-in commands of the shell describing ! 1101: how they are used. ! 1102: .PP ! 1103: The ! 1104: .I alias ! 1105: command described above is used to assign new aliases and to show the ! 1106: existing aliases. ! 1107: With no arguments it prints the current aliases. ! 1108: It may also be given only one argument such as ! 1109: .DS ! 1110: alias ls ! 1111: .DE ! 1112: to show the current alias for, e.g., `ls'. ! 1113: .PP ! 1114: The ! 1115: .I echo ! 1116: command prints its arguments. ! 1117: It is often used in ! 1118: .I "shell scripts" ! 1119: or as an interactive command ! 1120: to see what filename expansions will produce. ! 1121: .PP ! 1122: The ! 1123: .I history ! 1124: command will show the contents of the history list. ! 1125: The numbers given with the history events can be used to reference ! 1126: previous events which are difficult to reference using the ! 1127: contextual mechanisms introduced above. ! 1128: There is also a shell variable called ! 1129: .I prompt. ! 1130: By placing a `!' character in its value the shell will there substitute ! 1131: the number of the current command in the history list. ! 1132: You can use this number to refer to this command in a history substitution. ! 1133: Thus you could ! 1134: .DS ! 1135: set prompt=\'\e! % \' ! 1136: .DE ! 1137: Note that the `!' character had to be ! 1138: .I escaped ! 1139: here even within `\'' characters. ! 1140: .PP ! 1141: The ! 1142: .I limit ! 1143: command is used to restrict use of resources. ! 1144: With no arguments it prints the current limitations: ! 1145: .DS ! 1146: .ta 1i ! 1147: cputime unlimited ! 1148: filesize unlimited ! 1149: datasize 5616 kbytes ! 1150: stacksize 512 kbytes ! 1151: coredumpsize unlimited ! 1152: .so tabs ! 1153: .DE ! 1154: Limits can be set, e.g.: ! 1155: .DS ! 1156: limit coredumpsize 128k ! 1157: .DE ! 1158: Most reasonable units abbreviations will work; see the ! 1159: .I csh ! 1160: manual page for more details. ! 1161: .PP ! 1162: The ! 1163: .I logout ! 1164: command can be used to terminate a login shell which has ! 1165: .I ignoreeof ! 1166: set. ! 1167: .PP ! 1168: The ! 1169: .I rehash ! 1170: command causes the shell to recompute a table of where commands are ! 1171: located. This is necessary if you add a command to a directory ! 1172: in the current shell's search path and wish the shell to find it, ! 1173: since otherwise the hashing algorithm may tell the shell that the ! 1174: command wasn't in that directory when the hash table was computed. ! 1175: .PP ! 1176: The ! 1177: .I repeat ! 1178: command can be used to repeat a command several times. ! 1179: Thus to make 5 copies of the file ! 1180: .I one ! 1181: in the file ! 1182: .I five ! 1183: you could do ! 1184: .DS ! 1185: repeat 5 cat one >> five ! 1186: .DE ! 1187: .PP ! 1188: The ! 1189: .I setenv ! 1190: command can be used ! 1191: to set variables in the environment. ! 1192: Thus ! 1193: .DS ! 1194: setenv TERM adm3a ! 1195: .DE ! 1196: will set the value of the environment variable \s-2TERM\s0 ! 1197: to ! 1198: `adm3a'. ! 1199: A user program ! 1200: .I printenv ! 1201: exists which will print out the environment. ! 1202: It might then show: ! 1203: .DS ! 1204: % printenv ! 1205: HOME=/usr/bill ! 1206: SHELL=/bin/csh ! 1207: PATH=:/usr/ucb:/bin:/usr/bin:/usr/local ! 1208: TERM=adm3a ! 1209: USER=bill ! 1210: % ! 1211: .DE ! 1212: .PP ! 1213: The ! 1214: .I source ! 1215: command can be used to force the current shell to read commands from ! 1216: a file. ! 1217: Thus ! 1218: .DS ! 1219: source .cshrc ! 1220: .DE ! 1221: can be used after editing in a change to the ! 1222: .I \&.cshrc ! 1223: file which you wish to take effect right away. ! 1224: .PP ! 1225: The ! 1226: .I time ! 1227: command can be used to cause a command to be timed no matter how much ! 1228: \s-2CPU\s0 time it takes. ! 1229: Thus ! 1230: .DS ! 1231: % time cp /etc/rc /usr/bill/rc ! 1232: 0.0u 0.1s 0:01 8% 2+1k 3+2io 1pf+0w ! 1233: % time wc /etc/rc /usr/bill/rc ! 1234: 52 178 1347 /etc/rc ! 1235: 52 178 1347 /usr/bill/rc ! 1236: 104 356 2694 total ! 1237: 0.1u 0.1s 0:00 13% 3+3k 5+3io 7pf+0w ! 1238: % ! 1239: .DE ! 1240: indicates that the ! 1241: .I cp ! 1242: command used a negligible amount of user time (u) ! 1243: and about 1/10th of a system time (s); the elapsed time was 1 second (0:01), ! 1244: there was an average memory usage of 2k bytes of program space and 1k ! 1245: bytes of data space over the cpu time involved (2+1k); the program ! 1246: did three disk reads and two disk writes (3+2io), and took one page fault ! 1247: and was not swapped (1pf+0w). ! 1248: The word count command ! 1249: .I wc ! 1250: on the other hand used 0.1 seconds of user time and 0.1 seconds of system ! 1251: time in less than a second of elapsed time. ! 1252: The percentage `13%' indicates that over the period when it was active ! 1253: the command `wc' used an average of 13 percent of the available \s-2CPU\s0 ! 1254: cycles of the machine. ! 1255: .PP ! 1256: The ! 1257: .I unalias ! 1258: and ! 1259: .I unset ! 1260: commands can be used ! 1261: to remove aliases and variable definitions from the shell, and ! 1262: .I unsetenv ! 1263: removes variables from the environment. ! 1264: .NH 2 ! 1265: What else? ! 1266: .PP ! 1267: This concludes the basic discussion of the shell for terminal users. ! 1268: There are more features of the shell to be discussed here, and all ! 1269: features of the shell are discussed in its manual pages. ! 1270: One useful feature which is discussed later is the ! 1271: .I foreach ! 1272: built-in command which can be used to run the same command ! 1273: sequence with a number of different arguments. ! 1274: .PP ! 1275: If you intend to use \s-2UNIX\s0 a lot you you should look through ! 1276: the rest of this document and the csh manual pages (section1) to become familiar ! 1277: with the other facilities which are available to you. ! 1278: .bp
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.