csh -- invoke a shell command interpreter with C-like syntax


csh [ -cefinstvVxX ] [ arg ... ]


csh is a command language interpreter. When it is first invoked, csh executes commands from the file .cshrc, located in the home directory of the user. If it is a login shell, it then executes commands from the file .login (in the same directory). Subsequently, if it is running in interactive mode, csh reads commands from the terminal, prompting the user for each new line by printing a ``%''. Arguments to the shell, and the use of the shell to process files containing command scripts, are described later.

The shell repeatedly performs the following actions: a line of command input is read and broken into words. This sequence of words is placed on the command history list and then parsed. Finally, each command in the current line is executed.

When a login shell terminates, it executes commands from the file .logout in the user's home directory.

Lexical structure

The shell splits input lines into words at blanks and tabs with the following exceptions. The characters & | ; < > ( and ) are treated as separate words. Some of these characters can be paired up; the pairs &&, ||, <<, >> are treated as single words. In order to use these metacharacters within other words, their special meaning must be suppressed by preceding them with a backslash (\). A newline preceded by a ``\'' is equivalent to a blank.

In addition, strings enclosed in matched pairs of quotations, (`, ´ or "), form parts of a word; metacharacters in these strings, including blanks and tabs, are not treated as separate words. The semantics of quoted strings are described below. Within quoted strings delimited by pairs of (´) or (") characters, a newline preceded by a ``\'' gives a true newline character.

If the shell reads the character ``#'' in its input, it treats the rest of the current line (that is, all the text to the right of the ``#'') as a comment, and ignores it. The ``#'' character loses this special meaning if it is preceded by a backslash character (\) or placed inside quotation marks (`, ´, or ").


A simple command is a sequence of words, the first of which specifies the command to be executed. A simple command or a sequence of simple commands separated by ``|'' characters (pipes) forms a pipeline. The output from each command in a pipeline is used as the input to the next command. Sequences of pipelines may be separated by semi-colons (;); the elements of such a sequence are executed sequentially. A sequence of pipelines may be executed without waiting for it to terminate by ending the command line with an ampersand character (&). Such a sequence is protected from termination by hangup signals sent by the shell; the nohup command need not be used.

Any of the above commands may be placed in parentheses to form a new simple command (which in turn may be used as a component of a pipeline or some other more complex command). It is also possible to separate pipelines with the ``&&'' or ``||'' expressions: these stand for logical-OR and logical-AND respectively. (Due to an historical bug, csh assigns these symbols the opposite meaning to that assumed by the C programming language and other UNIX® utilities.) Use of these expressions makes the execution of the second pipeline conditional upon the success (logical-AND) or failure (logical-OR) of the first. (See ``Expressions'' for more information.)


The following sections describe the various transformations the shell performs on the input in the order in which they are carried out.

History substitutions

History substitutions can be used to reintroduce sequences of words from previous commands, possibly altering them in the process. Thus, history substitutions provide a general redo facility.

History substitutions begin with the character ``!'' and may begin anywhere in the input stream unless a history substitution is already in progress. A ``!'' preceded by a backslash (\), or followed by a space, tab, newline, ``='' or ``('', is treated as a literal ``!'' and its special meaning is suppressed. History substitutions may also occur when an input line begins with ``^''. This special abbreviation is described later.

The text of any input line containing a history substitution is echoed on the terminal after the substitution has been carried out, so that the user can see the literal command that is being executed.

Commands entered at the terminal and consisting of one or more words are saved on the history list, the size of which is controlled by the history variable. The previous command is always retained. Commands are assigned numbers incrementally, starting with 1 (the first command executed under the current csh).

For example, enter the command:


This internal command causes csh to print a list of the commands stored on the history list, along with their event numbers. Now, consider the following (sample) output from the history command:

    9  write michael
   10  ex write.c
   11  cat oldwrite.c
   12  diff *write.c
It is not usually necessary to use event numbers, but the current event number can be made part of the prompt by placing a ``!'' in the prompt string.

If the current event (the current command line) is 13, we can refer to previous command lines in several ways:

By event number:


to re-run cat oldwrite.c

By relative event number:


to go back two events; this will also re-run cat oldwrite.c

By part of a command:


to re-run the most recent command starting with a ``d'', in this case diff *write.c, or:


to re-run the most recent command containing the string ``mic'', write michael

These forms simply reproduce the words of the specified event, each separated by a single blank. The special case ``!!'' refers to the previous command; thus the history substitution ``!!'' means ``repeat the last command.'' The form ``!#'' references the current command (the one being entered on the current line). It allows a word to be selected from further left in the line, for example to avoid retyping a long name, as in ``!#:1''.

To select words from an event, we can follow the event specification by a colon (:) and a designator for the desired words. The words of an input line are numbered from 0, the first (usually command) word being 0, the second word (first argument) being 1, and so on. The basic word designators are:

first (command) word

nth argument

first argument, that is, 1

last argument

word matched by (immediately preceding) ?s? search

range of words

abbreviates 0-y

abbreviates ^-$, or nothing if only 1 word in the event

abbreviates x-$

like x* but omitting word $
The ``:'' separating the event specification from the word designator can be omitted if the argument selector begins with a ^, $, *, - or %. After the optional word designator, a sequence of modifiers can be placed, each preceded by a colon. The following modifiers are defined:

removes a trailing pathname component

removes a trailing .xxx component

returns the trailing .xxx pathname component

substitutes r for l

removes all leading pathname components

repeats the previous substitution

applies the change globally, prefixing the above

prints the new command but does not execute it

quotes the substituted words, preventing substitutions

like q, but breaks into words at blanks, tabs, and newlines
Unless preceded by g, the modification is applied only to the first modifiable word. In any case it is an error for no word to be applicable.

The left sides of substitutions are not regular expressions like those recognized by the editors, but rather strings. Any character may be used as the delimiter instead of ``/''; if it is necessary to include an instance of the delimiter character within one of the substitution strings, its special meaning may be removed by preceding it with a ``\''. An ampersand character (&) in the right side of a substitution is replaced by the text from the left side of the substitution. An ampersand preceded by a backslash (\&) is treated as a literal ampersand (&) with no special meaning. A null l uses the previous string either from an l or from a contextual scan string s in ``!?s?''. The trailing delimiter in the substitution may be omitted if a newline follows immediately, as may the trailing ``?'' in a contextual scan.

A history reference may be given without an event specification (for example, !$). It is assumed that the reference is to the previous command unless a history substitution precedes it on the same line, in which case it is assumed to refer to the last event substitution. Thus !?foo?^!$ gives the first and last arguments from the command matching ?foo?.

A special abbreviation of a history reference occurs when the first nonblank character of an input line is a ``^''. This is equivalent to !:s^, providing a convenient shorthand for substitutions on the text of the previous line. Thus ^lb^lib fixes the spelling of lib in the previous command.

Finally, a history substitution may be surrounded with ``{'' and ``}'' if necessary to insulate it from the characters that follow. Thus, after ls -ld ~paul, the command !{l}a performs ls -ld ~paula, while the command !la looks for a command starting la.

Quotations with ' and ''

Quoted (´) or double quoted (") strings are exempt from some or all of the substitutions. Strings enclosed in single quotes are not subject to interpretation. Strings enclosed in double quotes are subject to variable and command expansion. Since history (!) substitution occurs within all quotes, you must escape ``!'' with a backslash (\), even within quotes, if you want to prevent history substitution.

In both cases, the resulting text becomes all or part of a single word; only in one special case (see ``Command substitution'' below) does a double quoted string yield parts of more than one word; single quoted strings never do.

Alias substitution

The shell maintains a list of aliases which can be established, displayed and modified by the alias and unalias commands. After a command line is scanned, it is parsed into distinct commands and the first word of each command, left-to-right, is checked to see if it has an alias. If it has, then the text of the alias for that command is reread, and the history mechanism is applied to it as though that command were the previous input line. The resulting words replace the command and argument list. If no reference is made to the history list, then the argument list is left unchanged.

Thus, if the alias for ls is ls -l, the command ls /usr maps to ls -l /usr. Similarly if the alias for lookup is grep \!^ /etc/passwd, then lookup bill maps to grep bill /etc/passwd.

If an alias is found, the word transformation of the input text is performed and the aliasing process begins again on the newly generated input line. Looping is prevented by flagging the first word of the old text; if the first word of the new text is the same, further aliasing is prevented. Other loops are detected and cause an error.

Note that the mechanism allows aliases to introduce parser metasyntax. Thus:

   alias print 'pr :* | lpr'
makes a command that paginates its arguments to the lineprinter.

There are four csh aliases distributed. These are pushd, popd, swapd, and flipd. These aliases maintain a directory stack.

pushd dir
Pushes the current directory onto the top of the directory stack, then changes to the directory dir.

Changes to the directory at the top of the stack, then removes (pops) the top directory from the stack, and announces the current directory.

Swaps the top two directories on the stack. The directory on the top becomes the second to the top, and the second to the top directory becomes the top directory.

Flips between two directories, the current directory and the top directory on the stack. If you are currently in dir1, and dir2 is on the top of the stack, when flipd is invoked you change to dir2, and dir1 is replaced as the top directory on the stack. When flipd is again invoked, you change to dir1, and dir2 is again the top directory on the stack.

Variable substitution

The shell maintains a set of variables, each of which has a list of zero or more words as its value. Some of these variables are set by the shell or referred to by it. For instance, the argv variable is an image of the shell's argument list, and words of this variable's value are referred to in special ways.

The values of variables may be displayed and changed by using the set and unset commands. Of the variables referred to by the shell a number are toggles; the shell does not care what their value is, only whether they are set or not. For instance, the verbose variable is a toggle which causes command input to be echoed. The setting of this variable results from the -v command line option.

Other operations treat variables numerically. The @ command permits numeric calculations to be performed and the result to be assigned to a variable. However, variable values are always represented as zero or more strings. For the purposes of numeric operations, the null string is considered to be 0, and the second and subsequent words of multiword values are ignored.

After the input line is aliased and parsed, and before each command is executed, variable substitution is performed, keyed by dollar sign ($) characters. This expansion can be prevented by preceding the dollar sign with a backslash (\) except within double quotation marks (") where it always occurs, and within single quotation marks (´) where it never occurs. Strings quoted by back quotation marks (`) are interpreted later (see ``Command substitution'' below) so dollar sign substitution does not occur there until later, if at all. A dollar sign is passed unchanged if followed by a blank, tab, or end-of-line.

Input and output redirections are recognized before variable expansion, and are expanded separately. Otherwise, the command name and entire argument list are expanded together. It is thus possible for the first (command) word to generate more than one word, the first of which becomes the command name, and the rest of which become arguments.

Unless enclosed in double quotation marks or given the :q modifier, the results of variable substitution may eventually be subject to command and filename substitution. Within double quotation marks ("), a variable whose value consists of multiple words expands to a portion of a single word, with the words of the variable's value separated by blanks. When the :q modifier is applied to a substitution, the variable expands to multiple words with each word separated by a blank and quoted to prevent later command or filename substitution.

The following sequences are provided for introducing variable values into the shell input. Except as noted, it is an error to reference a variable which is not set.


Are replaced by the words of the value of variable name, each separated by a blank. Braces insulate name from following characters which would otherwise be part of it. Shell variables have names consisting of up to 20 letters, digits, and underscores. If name is not a shell variable, but is set in the environment, then that value is returned (but ``:'' modifiers and the other forms given below are not available in this case).


May be used to select only some of the words from the value of name. The selector is subjected to $ substitution and may consist of a single number or two numbers separated by a ``-''. The first word of a variable's value is numbered 1. If the first number of a range is omitted it defaults to 1. If the last member of a range is omitted it defaults to $#name. The selector ``*'' selects all words. It is not an error for a range to be empty if the second argument is omitted or in range.


Give the number of words in the variable. This is useful for later use in a [selector].

Substitutes the name of the file from which command input is being read. An error occurs if the name is not known.


Are equivalent to $argv[number].

Is equivalent to $argv[*].
The modifiers :h, :t, :r, :q and :x may be applied to the substitutions above, as may :gh, :gt and :gr. If braces ({ and }) appear in the command form then the modifiers must appear within the braces. Only one ``:'' modifier is allowed on each $ expansion.

The following substitutions may not be modified with ``:'' modifiers.


Substitutes the string 1 if name is set, 0 if it is not.

Substitutes 1 if the current input filename is known, 0 if it is not.

Substitutes the decimal process number of the parent shell.

Command and filename substitution

Command and filename substitution are applied selectively to the arguments of built-in commands. This means that portions of expressions which are not evaluated are not subjected to these expansions. For commands which are not internal to the shell, the command name is substituted separately from the argument list. This occurs very late, after input-output redirection is performed, and in a child of the main shell.

Command substitution

Command substitution is indicated by a command enclosed in back quotation marks (`). The output from such a command is normally broken into separate words at blanks, tabs and newlines, with null words being discarded. This text then replaces the original string. Within double quotation marks, only newlines force new words; blanks and tabs are preserved.

In any case, the single final newline does not force a new word. Note that it is possible for a command substitution to yield only part of a word, even if the command outputs a complete line.

Filename substitution

If a word contains any of the characters * ? [ { or begins with the character ``~'', then that word is a candidate for filename substitution, also known as globbing. This word is then regarded as a pattern, and is replaced with an alphabetically sorted list of filenames which match the pattern.

The character ``~'' at the beginning of a filename is used to refer to home directories. Standing alone, it expands to the invoker's home directory contained in the variable HOME. When ``~'' is followed by a name consisting of letters, digits, and underscore characters (like_this), the shell searches for a user with that name and substitutes the user's home directory; thus ~ken might expand to /usr/ken and ~ken/chmach to /usr/ken/chmach. If the character ``~'' is followed by a character other than a letter or ``/'', or if it does not appear at the beginning of a word, it is left unchanged.

The metanotation a{b,c,d}e is shorthand for abe ace ade. Left to right order is preserved, with the results of matches being sorted separately at a low level to preserve this order. Thus ~source/s1/{oldls,ls}.c expands to /usr/source/s1/oldls.c /usr/source/s1/ls.c, whether or not these files exist, assuming that the home directory for the source is /usr/source, Similarly, ../{memo, *box} might expand to ../memo ../box ../mbox. Note that memo was not sorted with the results of matching *box. As a special case, ``{'', ``}'' and ``{}'' are passed unchanged. This construct can be nested.

The file patterns (shell regular expressions) matched by the C shell are described in regexp(M).

Spelling checker

If the local variable cdspell has been set, the shell checks spelling whenever cd is used to change directories. For example, if you change to a different directory using cd and misspell the directory name, the shell responds with an alternative spelling of an existing directory. Enter ``y'' and press <Enter> (or just press <Enter>) to change to the offered directory. If the offered spelling is incorrect, enter ``n'', then retype the command line. In this example the csh response is in light type:

% cd /usr/spool/uucp



The standard input and standard output of a command may be redirected with the following syntax:

< name
Opens file name (after variable, command and filename expansion) as the standard input.

<< word
Reads the shell input up to a line which is identical to word. word is not subjected to variable, filename or command substitution, and each input line is compared to word before any substitutions are done on this input line. Unless a quoting backslash, double, or single quotation mark, or a back quotation mark appears in word, variable and command substitution is performed on the intervening lines, allowing ``\'' to quote ``$'', ``\'' and ```''. Commands which are substituted have all blanks, tabs, and newlines preserved, except for the final newline which is dropped. The resulting text is placed in an anonymous temporary file which is given to the command as standard input.

> name

>! name

>& name

>&! name
Opens the file name as the standard output. If the file does not exist, then it is created; if the file exists, it is overwritten.

If the variable noclobber is set, then an error results if the file already exists or if it is not a character special file (for example, a terminal or /dev/null). This helps prevent accidental destruction of files. In this case, the ``!'' forms can be used to suppress this check.

The forms involving ``&'' route the standard error into the specified file as well as the standard output. name is expanded in the same way as ``<'' input filenames are.

>> name

>>& name

>>! name

>>&! name
Uses file name as the standard output. This is like ``>'' but places output at the end of the file. If the variable noclobber is set, then it is an error for the file not to exist unless one of the ``!'' forms is given. Otherwise it is similar to ``>''.
If a command is run in the background (followed by ``&'') then the default standard input for the command is the empty file /dev/null. Otherwise, the command receives the input and output parameters from its parent shell. Thus, unlike some previous shells, commands run from a file of shell commands have no access to the text of the commands by default; rather they receive the original standard input of the shell. The << mechanism should be used to present inline data. This permits shell command scripts to function as components of pipelines and allows the shell to block read its input.

The standard error may be directed through a pipe with the standard output. Simply use the form ``|&'' rather than ``|''.


A number of the built-in commands (to be described later) take expressions, in which the operators are similar to those of C, with the same precedence. These expressions appear in the @, exit, if, and while commands. The following operators are available:

|| && | ^ & == != <= >= < > << >>
+ - * / % ! ~ ( )

Here the precedence increases to the right, == and !=, <=, >=, <, and >, << and >>, + and -, * / and % being, in groups, at the same level. The == and != operators compare their arguments as strings, all others operate on numbers. Strings which begin with 0 are considered octal numbers. Null or missing arguments are considered 0. The results of all expressions are strings, which represent decimal numbers. Note that no two components of an expression can appear in the same word unless the word is adjacent to components of expressions that are syntactically significant to the parser (& | < > ( )). These components should be surrounded by spaces.

Also available in expressions as primitive operands are command executions enclosed in ``{'' and ``}'' and file enquiries of the form -l name where l is one of:

Read access

Write access

Execute access



Zero size

Plain file


Command and filename expansion is applied to the specified name, then the result is tested to see if it has the specified relationship to the real user. If the file does not exist or is inaccessible then all enquiries return false, that is 0. Command executions succeed, returning true, that is 1, if the command exits with status 0, otherwise they fail, returning false, that is 0.

If more detailed status information is required then the command should be executed outside of an expression and the variable status examined.

Control flow

The shell contains a number of commands which can be used to regulate the flow of control in command files (shell scripts) and (in limited but useful ways) from terminal input. Due to the implementation, some restrictions are placed on the word placement for the foreach, switch, and while statements, as well as the if-then-else form of the if statement. Please pay careful attention to these restrictions in the descriptions in the next section.

If the shell's input is not seekable, the shell buffers up input whenever a loop is being read and performs seeks in this internal buffer to accomplish the rereading implied by the loop. (To the extent that this allows, backward goto commands will succeed on nonseekable inputs.)

Built-in commands

Built-in commands are executed within the shell. If a built-in command occurs as any component of a pipeline except the last, then it is executed in a subshell.


alias name

alias name wordlist
The first form prints all aliases. The second form prints the alias for name. The final form assigns the specified wordlist as the alias of name. wordlist is the command; filename substitution may be applied to wordlist. name is not allowed to be alias or unalias.

This causes execution to resume after the end of the nearest enclosing foreach or while statement. The remaining commands on the current line are executed. Multilevel breaks are thus possible by writing them all on one line.

This causes a break from a switch, resuming after the endsw.

case label:
This is part of the switch statement discussed below.

cd [ -L | -P ] [ name ]

chdir [ -L | -P ] [ name ]
These commands change the shell's working directory to directory name. If no argument is given, the new directory is the home directory of the user. If name is not found as a subdirectory of the current directory (and does not begin with ``/'', ``./'', or ``../''), then each component of the variable cdpath is checked to see if it has a subdirectory name. Finally, if all else fails but name is a shell variable whose value begins with ``/'', then this is tried to see if it is a directory.

If cdspell has been set, the shell runs a spelling check as follows. If the shell is reading its commands from a terminal, and the specified directory does not exist (or some component cannot be searched), spelling correction is applied to each component of directory in a search for the ``correct'' name. The shell then asks whether or not to try and change the directory to the corrected directory name; an answer of n means ``no'', and anything else is taken as ``yes.''

The -L and -P flags are relevant to systems with symbolic links:

Preserve logical pathnames so that cd -L .. moves up one component towards the root along the current logical path.

Use a physical model for pathnames so that cd -L .. moves up one component towards the root by following the link to the parent of the current directory. This is the default behavior.

For example, if /usr/include/sys/h is a symbolic link to the directory /sys/h, then cd /usr/include/sys/h; cd -L .. would make /usr/include/sys the current directory; cd /usr/include/sys/h; cd -P .. would make /sys the current directory.

If the variable cdlogical is set, the default behavior of cd and chdir is to use logical pathnames when changing directories.

This continues execution of the nearest enclosing while or foreach. The rest of the commands on the current line are executed.

This labels the default case in a switch statement. The default should come after all case labels.

echo wordlist
The specified words are written to the shell's standard output. A ``\c'' causes the echo to complete without printing a newline. A ``\n'' in wordlist causes a newline to be printed. Otherwise the words are echoed, separated by spaces.




See the description of the foreach, if, switch, and while statements below.

exec command
The specified command is executed in place of the current shell.


exit (expr)
The shell exits either with the value of the status variable (first form) or with the value of the specified expr (second form).

foreach name (wordlist)


The variable name is successively set to each member of wordlist and the sequence of commands between this command and the matching end are executed. (Both foreach name (wordlist) and end must appear alone on separate lines.)

The built-in command continue may be used to continue the loop prematurely and the built-in command break to terminate it prematurely. When this command is read from the terminal, the contents of the loop are read by prompting with ``?'' until end is typed before any statements in the loop are executed.

glob wordlist
This is like echo but no ``\'' escapes are recognized and words are delimited by null characters in the output. This is useful for programs which wish to use the shell to apply filename expansion to a list of words.

goto word
Filename and command expansion is applied to the specified word to yield a string of the form label:. The shell rewinds its input as much as possible and searches for a line of the form label: possibly preceded by blanks or tabs. Execution continues after the specified line.

This displays the history event list.

if (expr) command
If the specified expression evaluates true, then the single command with arguments is executed. Variable substitution on command happens early, at the same time as for the rest of the if command. command must be a simple command, not a pipeline, a command list, or a parenthesized command list. Input/output redirection occurs even if expr is false, and command is not executed.

if (expr) then


else if (expr2) then




If the specified expr is true then the commands before the first else are executed; else if expr2 is true then the commands after the second then and before the second else are executed, etc. Any number of else-if pairs are possible; only one endif is needed. The else part is likewise optional. (The words else and endif must appear at the beginning of input lines; the if (expr) then must appear alone on its input line or after an else.)

This terminates a login shell. Use this if ignoreeof is set.


nice +number

nice command

nice +number command
The first form sets the nice for this shell to 4. By default, commands run under C-Shell have a ``nice value'' of 0. The second form sets the nice to the given number. The final two forms run command at priority 4 and number respectively. root may specify negative niceness by using nice -number .... The command is always executed in a subshell, and the restrictions placed on commands in simple if statements apply.


nohup command
The first form can be used in shell scripts to cause hangups to be ignored for the remainder of the script. The second form causes the specified command to be run with hangups ignored. Unless the shell is running in the background, nohup has no effect. All processes running in the background with ``&'' are automatically nohuped.


onintr -

onintr label
This controls the action of the shell on interrupts. The first form restores the default action of the shell on interrupts, which is to terminate shell scripts or to return to the terminal command input level. The second form, onintr -, causes all interrupts to be ignored. The final form causes the shell to execute a goto label when an interrupt is received or a child process terminates because it was interrupted. In any case, if the shell is running in the background, interrupts are ignored whether any form of onintr is present or not.

pwd [ -L | -P ]
Prints the current working directory. The -L and -P flags are useful with symbolic links:

Show the logical pathname to the directory preserving the route taken to get there.

Show the physical pathname to the directory. This is the default behavior.

For example, if /usr/include/sys/h is a symbolic link to the directory /sys/h, then cd /usr/include/sys/h; pwd -L prints /usr/include/sys/h as the current working directory; cd/usr/include/sys/h; pwd -P prints /sys/h as the current working directory.

If the variable cdlogical is set, the default behavior of pwd is to report logical pathnames.

This causes the internal hash table of the contents of the directories in the path variable to be recomputed. This is needed if new commands are added to directories in the path while you are logged in.

repeat count command
The specified command, which is subject to the same restrictions as the command in the simple if statement above, is executed count times. I/O redirection occurs exactly once, even if count is 0.


set name

set name=word

set name[index]=word

set name=(wordlist)
The first form of the command shows the value of all shell variables. Variables which have other than a single word as value print as a parenthesized word list. The second form sets name to the null string. The third form sets name to the single word. The fourth form sets the indexth component of name to word; this component must already exist. The final form sets name to the list of words in wordlist. Command and filename expansion is applied in all cases. These arguments may be repeated to set multiple values in a single set command. Note however, that variable expansion happens for all arguments before any setting occurs.

setenv name value
This sets the value of the environment variable name to be value, which must be a single string. Two useful environment variables are TERM, the type of your terminal and SHELL, the shell you are using.


shift variable
In the first form, the members of argv are shifted to the left, discarding argv[1]. It is an error for argv not to be set or to have less than one word as a value. The second form performs the same function on the specified variable.

source name
The shell reads commands from name. source commands may be nested, but if they are nested too deeply, the shell may run out of file descriptors. An error in a source at any level terminates all nested source commands, including the csh process from which source was called. If source is called from the login shell, it is logged out. Input during source commands is never placed on the history list.

switch (string)

case str1:







Command and filename substitution is applied to string; each case label is then successively matched against the result. Variable expansion is also applied to the case labels, so the file metacharacters ``*'', ``?'', and ``[...]'' can be used. If none of the labels match before a default label is found, then the execution begins after the default label. Each case label and the default label must appear at the beginning of a line. The command breaksw causes execution to continue after the endsw. Otherwise control may fall through case labels and default labels, as in C. If no label matches and there is no default, execution continues after the endsw.


time command
With no argument, a summary of CPU time used by this shell and its children is printed. If arguments are given, the specified simple command is timed and a time summary as described under the time variable is printed. If necessary, an extra shell is created to print the time statistic when the command completes. command has the same restrictions as the simple if statement described above.


umask -S

umask mask
The file creation mask is displayed if no arguments are given. Alternatively, the file creation mask is set to the value specified by mask. If mask is an octal integer, the specified bits will be set in the umask. Otherwise mask should be a symbolic mode (see chmod(C)), the new value of the file creation mask being the logical complement of the file permission bits specified.

If no umask is specified, the current file mode creation mask is printed. The default format is an octal integer. If the -S argument is given the symbolic form is printed. Common values for the mask are 002, giving all access to the group and read and execute access to others, and 022, giving read and execute access to users in the group and all other users. See also umask(C).

unalias pattern
All aliases whose names match the specified pattern are discarded. Thus, all aliases are removed by unalias *. It is not an error for nothing to be unaliased.

Use of the internal hash table to speed location of executed programs is disabled.

unset pattern
All variables whose names match the specified pattern are removed. Thus, all variables are removed by unset *; use this with care. It is not an error for nothing to be unset.

unsetenv pattern
All environment variables whose names match the specified pattern are removed.

All child processes are waited for. If the shell is interactive, then an interrupt can disrupt the wait, at which time the shell prints names and process numbers of all children known to be outstanding.

while (expr)


While the specified expression evaluates non-zero, the commands between the while and the matching end are evaluated. break and continue may be used to terminate or continue the loop prematurely. (The while (expr) and end must appear alone on their input lines.) Prompting occurs here the first time through the loop as for the foreach statement if the input is a terminal.


@ name = expr

@ name[index] = expr
The first form prints the values of all the shell variables. The second form sets the specified name to the value of expr. If the expression contains <, >, & or | then at least this part of the expression must be placed within ( ). The third form assigns the value of expr to the indexth argument of name. Both name and its indexth component must already exist.


The operators *=, +=, etc. are available as in C. The space separating the name from the assignment operator is optional. Spaces are mandatory in separating components of expr which would otherwise be single words. The space between @ and name is also mandatory.


Special postfix ++ and -- operators increment and decrement name respectively, that is @ i++.

Predefined variables

The following variables have special meaning to the shell. Of these, ARGV, CHILD, HOME, PATH, PROMPT, SHELL and STATUS are always set by the shell. Except for CHILD and STATUS this setting occurs only at initialization; these variables will not be modified unless done explicitly by the user.

The shell copies the environment variable PATH into the variable PATH, and copies the value back into the environment whenever PATH is set. Thus it is not necessary to worry about its setting other than in the file .login, since inferior csh processes will import the definition of PATH from the environment.

Set to the arguments to the shell, it is from this variable that positional parameters are substituted, that is, $1 is replaced by argv[1], and so on. argv[0] is not defined, but $0 is.

This gives a list of alternate directories searched to find subdirectories in cd commands.

This is the process number of the last command forked with ``&''. This variable is unset when this process terminates.

This is set when the -x command line option is given. It causes each command and its arguments to be echoed just before it is executed. For non-built-in commands all expansions occur before echoing. Built-in commands are echoed before command and filename substitution, since these substitutions are then done selectively.

This can be assigned a two-character string. The first character is used as a history character in place of ``!'', the second character is used in place of the ``^'' substitution mechanism. For example, set histchars=",;" will cause the history characters to be comma and semicolon.

This can be given a numeric value to control the size of the history list. Any command which has been referenced in this many events will not be discarded. A history that is too large may run the shell out of memory. The last executed command is always saved on the history list.

This is the home directory of the invoker, initialized from the environment. The filename expansion of ``~'' refers to this variable.

If this is set, the shell ignores end-of-file from input devices that are terminals. This prevents a shell from accidentally being terminated by pressing <Ctrl>d.

These are files where the shell checks for mail. This check is executed after each command completion. The shell responds with, ``You have new mail'' if the file exists with an access time not greater than its modify time.

If the first word of the value of MAIL is numeric, it specifies a different mail checking interval: in seconds, rather than the default, which is 10 minutes.

If multiple mail files are specified, then the shell responds with ``New mail in name'', when there is mail in the file name.

As described in the section ``Input/output'', restrictions are placed on output redirection to insure that files are not accidentally destroyed, and that >> redirections refer to existing files.

If this is set, filename expansion is inhibited. This is most useful in shell scripts which are not dealing with filenames, or after a list of filenames has been obtained and further expansions are not desirable.

If this is set, it is not an error for a filename expansion not to match any existing files; rather, the primitive pattern is returned. It is still an error for the primitive pattern to be malformed, that is, echo [ still gives an error.

Each word of the PATH variable specifies a directory in which commands are to be sought for execution. A null word specifies the current directory. If there is no path variable, then only full pathnames execute. The usual search path is /bin, /usr/bin, and ., but this may vary from system to system. For root, the default search path is /etc, /bin and /usr/bin. A shell which is given neither the -c nor the -t option will normally hash the contents of the directories in the path variable after reading .cshrc, and each time the path variable is reset. If new commands are added to these directories while the shell is active, it may be necessary to give the rehash command, or the commands may not be found.

This is the string which is printed before reading each command from an interactive terminal input. If a ``!'' appears in the string, it will be replaced by the current event number unless a preceding ``\'' is given. The default is ``%'', or ``#'' for root.

This is the file in which the shell resides. This is used in forking shells to interpret files which have execute bits set, but which are not executable by the system. (See the description of ``Non-built-in command execution'' below.) It is initialized to the home of the shell.

This is the status returned by the last command. If it terminated abnormally, then 0200 is added to the status. Built-in commands which fail return exit status 1, otherwise these commands set status to 0.

This controls automatic timing of commands. If it is set, then any command which takes more than this many cpu seconds will cause a line to be sent to the screen displaying user time, system time, real time, and a utilization percentage which is the ratio of user plus system times to real time.

Set by the -v command line option, this causes the words of each command to be printed after history substitution.

Non-built-in command execution

When a command to be executed is found not to be a built-in csh command, the shell attempts to execute the command via exec(S). Each word in the variable PATH names a directory from which the shell will attempt to execute the command. If it is given neither a -c nor a -t option, the shell will hash the names in these directories into an internal table so that it will only try an exec in a directory if there is a possibility that the command resides there. This greatly speeds command location when a large number of directories are present in the search path.

The shell concatenates each directory component of PATH with the given command name to form a pathname of a file which it then attempts to execute. This concatenation occurs if any of the following is true:

Parenthesized commands are always executed in a subshell. Thus:

   (cd; pwd); pwd
prints the home directory but leaves you in the original directory, while:
   cd; pwd
moves you to the home directory.

If the file has execute permissions but is not an executable binary to the system, then it is assumed to be a file containing shell commands and a new shell is spawned to read it.

If there is an alias for SHELL then the words of the alias are prefixed to the argument list to form the shell command. The first word of the alias should be the full pathname of the shell (for example, $shell). Note that this is a special, late occurring, case of alias substitution, and only allows words to be prefixed to the argument list without modification.

Argument list processing

If argument 0 to the shell is ``-'' then this is a login shell. The flag arguments are interpreted as follows:

Commands are read from the (single) following argument which must be present. Any remaining arguments are placed in argv.

The shell exits if any invoked command terminates abnormally or yields a non-zero exit status.

The shell starts faster, because it neither searches for nor executes commands from the file .cshrc in the invoker's home directory.

The shell is interactive and prompts for its top-level input, even if it appears not to be a terminal. Shells are interactive without this option if their input and output are terminals.

Commands are parsed, but not executed. This may aid in syntactic checking of shell scripts.

Command input is taken from the standard input.

A single line of input is read and executed. A ``\'' may be used to escape the newline at the end of this line and continue onto another line.

This causes the VERBOSE variable to be set, with the effect that command input is echoed after history substitution.

This causes the ECHO variable to be set, so that commands are echoed immediately before execution.

This causes the VERBOSE variable to be set even before .cshrc is executed.

This causes the ECHO variable to be set even before .cshrc is executed.

After processing the flag arguments, if arguments remain but none of the -c, -i, -s, or -t options were given, the first argument is taken as the name of a file of commands to be executed. The shell opens this file, and saves its name for possible resubstitution by $0. On a typical system, most shell scripts are written for the standard shell (see sh(C)). The C shell will execute such a standard shell if the first character of the script is not a ``#'' (that is, if the script does not start with a comment). Remaining arguments initialize the variable ARGV.

Signal handling

The shell normally ignores quit signals. The interrupt and quit signals are ignored for an invoked command if the command is followed by ``&''; otherwise the signals have the values which the shell inherited from its parent. The shell's handling of interrupts can be controlled by onintr. By default, login shells catch the terminate signal; otherwise this signal is passed on to children from the state in the shell's parent. In no case are interrupts allowed when a login shell is reading the file .logout.


Built-in control structure commands like foreach and while cannot be used with ``|'', ``&'' or ``;''.

Commands within loops, prompted for by ``?'', are not placed in the history list.

It is not possible to use the colon (:) modifiers on the output of command substitutions.

The C shell has many built-in commands with the same name and functionality as Bourne shell commands. However, the syntax of these C shell and Bourne shell commands often differs. Two examples are the nice and echo commands. Be sure to use the correct syntax when working with these built-in C shell commands.

When a C-shell user logs in, the system reads and executes commands in /etc/cshrc before executing commands in the user's $HOME/.cshrc and $HOME/.login. You can, therefore, modify the default C shell environment for all users on the system by editing /etc/cshrc.

During intervals of heavy system load, pressing the delete key while at a C shell prompt (%) may cause the shell to exit. If csh is the login shell, the user is logged out.

csh attempts to import and export the PATH environment variable for use with regular shell scripts. This only works for simple cases, where the PATH contains no command characters.

The || and && operators are reversed in this implementation.

Words can be no longer than 512 characters. The number of arguments to a command which involves filename expansion is limited to 1/6th the number of characters allowed in an argument list, which is 5120, less the characters in the environment. The length of any argument of a command after filename expansion cannot exceed 159 characters. Also, command substitutions may substitute no more characters than are allowed in an argument list.

To detect looping, the shell restricts the number of alias substitutions on a single line to 20.


read by each shell at the beginning of execution

systemwide default .cshrc file for login C shells

read by login shell, after .cshrc at login

read by login shell, at logout

shell for scripts not starting with a ``#''

temporary file for <<

source of empty file

source of home directories for username

Open UNIX 8 compatibility notes

When running ACP on Open UNIX 8 and UnixWare 7 systems, set OSRCMDS=on to use the SCO OpenServer version of the <csh> command. This provides the expected behaviors for SCO OpenServer applications. The SCO OpenServer version of this command is also provided on Open UNIX 8 systems under the OSP feature See the Running SCO OpenServer Applications topic in the Open UNIX 8 documentation set.

See also

access(S), environ(M), exec(S), fork(S), pipe(S), pwd(C), regexp(M), signal(S), umask(S), wait(S)

Chapter 10, ``Configuring and working with the shells'' in the SCO OpenServer Operating System User's Guide

Standards conformance

This utility is not part of any currently supported standard; it was developed at the University of California at Berkeley and is used with permission.
© 2003 Caldera International, Inc. All rights reserved.
SCO OpenServer Release 5.0.7 -- 11 February 2003