Annotation of 43BSDReno/share/doc/usd/04.csh/csh.2, revision 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.