Annotation of 43BSDReno/share/doc/usd/04.csh/csh.2, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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