Variables

This subsection describes the following:

Variable Substitution

In the following substitutions, braces ({}) are optional, except when needed to separate a variable name from following characters that would otherwise be considered part of the name:

Variable Description
${var} The value of variable var.
${var[i]} Select word or words in position i of var. i can be a single number, a range m-n, a range -n (missing m implies 1), a range m- (missing n implies all remaining words), or * (select all words). i also can be a variable that expands to one of these values.
${#var} The number of words in var.
${#argv} The number of arguments.
$0 Name of the program.
${argv[n]} Individual arguments on command line (positional parameters); 1 Screenshot n Screenshot 9.
${n} Same as ${argv[n]}.
${argv[*]} All arguments on command line.
$* Same as {$argv[*]}.
$argv[$#argv] The last argument.
${?var} Return 1 if var is set, 0 if var is not set.
$$ Process number of current shell; useful as part of a filename for creating temporary files with unique names.
${?name} Return 1 if name is set, 0 if not.
$?0 Return 1 if input filename is known, 0 if not.

Examples

Sort the third through last arguments and save the output in a file whose name is unique to this process:

sort $argv[3-] > tmp.$$

Process cshrc commands only if the shell is interactive (i.e., the prompt variable must be set):

if ($?prompt) then set commands, alias commands, etc. endif


Variable Modifiers

Except for $?var, $$, and $?0, the variable substitutions in the preceding section may be followed by one of these modifiers (when braces are used, the modifier goes inside them):

Examples using pathname modifiers

The following table shows the use of pathname modifiers on the following variable:

set aa=(/progs/num.c /tutorial/chap.ps)


Variable Portion Specification Output Result
Normal variable echo $aa /progs/num.c /tutorial/chap.ps
Second root echo $aa[2]:r /tutorial/chap
Second header echo $aa[2]:h /tutorial
Second tail echo $aa[2]:t chap.ps
Second extension echo $aa[2]:e ps
Root echo $aa:r /progs/num /tutorial/chap.ps
Global root echo $aa:gr /progs/num /tutorial/chap
Header echo $aa:h /progs /tutorial/chap.ps
Global header echo $aa:gh /progs /tutorial
Tail echo $aa:t num.c /tutorial/chap.ps
Global tail echo $aa:gt num.c chap.ps
Extension echo $aa:e c /tutorial/chap.ps
Global extension echo $aa:ge c ps

Examples using quoting modifiers

Unless quoted, the shell expands variables to represent files in the current directory:

% set a="[a-z]*" A="[A-Z]*" % echo "$a" "$A" [a-z]* [A-Z]* % echo $a $A at cc m4 Tutorial Doc % echo $a:x $A [a-z]* Tutorial Doc % set d=($a:q $A:q) % echo $d at cc m4 Tutorial Doc % echo $d:q [a-z]* [A-Z]* % echo $d[1] +++ $d[2] at cc m4 +++ Tutorial Doc % echo $d[1]:q [a-z]*


Predefined Shell Variables

Variables can be set in one of two ways, by assigning a value:

set var=value


or by simply turning the variable on:

set var

In the following list, variables that accept values are shown with the equals sign followed by the type of value they accept; the value then is described. (Note, however, that variables such as argv, cwd, or status are never explicitly assigned.) For variables that are turned on or off, the table describes what they do when set. tcsh automatically sets (and, in some cases, updates) the variables addsuffix, argv, autologout, cwd, dirstack, echo-style, edit, gid, home, loginsh, logout, oid, owd, path, prompt, prompt2, prompt3, shell, shlvl, status, tcsh, term, tty, uid, user, and version. Variables in italics are specific to tcsh.

Variable Description
addsuffix Append / to directories and a space to files during tab completion to indicate a precise match.
ampm Display all times in 12-hour format.
argv=(args) List of arguments passed to current command; default is ().
autocorrect Check spelling before attempting to complete commands.
autoexpand Expand history (such as ! references) during command completion.
autolist[=ambiguous] Print possible completions when correct one is ambiguous. If ambiguous is specified, print possible completions only when completion adds no new characters.
autologout=logout-minutes [locking-minutes] Log out after logout-minutes of idle time. Lock the terminal after locking-minutes of idle time, requiring a password before continuing. Not used if the DISPLAY environment variable is set.
backslash_quote Always allow backslashes to quote \, ', and <">.
cdpath=dirs List of alternate directories to search when locating arguments for cd, popd, or pushd.
color Turn on color for ls-F, ls, or both. Setting to nothing is equivalent to setting for both.
command If set, holds the command passed to the shell with the -c option.
complete=enhance When enhance, ignore case in completion, treat ., -, and _ as word separators, and consider _ and - to be the same.
correct={cmd|complete|all} When cmd, spellcheck commands. When complete, complete commands. When all, spellcheck whole command line.
cwd=dir Full pathname of current directory.
dextract When set, the pushd command extracts the desired directory and puts it at the top of the stack, instead of rotating the stack.
dirsfile=file History file consulted by dirs -S and dirs -L. Default is ~/.cshdirs.
dirstack Directory stack, in array format. dirstack[0] is always equivalent to cwd. The other elements can be artificially changed.
dspmbyte=code Enable use of multibyte code; for use with Kanji. See the tcsh manpage for details.
dunique Make sure that each directory exists only once in the stack.
echo Redisplay each command line before execution; same as csh -x command.
echo_style={bsd|sysv|both|none} Don't echo a newline with -n option (bsd) | parse escaped characters (sysv) | do both | do neither.
edit Enable command-line editor.
ellipsis For use with prompt variable. Represent skipped directories with .
fignore=chars List of filename suffixes to ignore during filename completion (see filec).
filec If set, a filename that is partially typed on the command line can be expanded to its full name when Esc is pressed. If more than one filename would match, type EOF to list possible completions. Ignored in tcsh.
gid User's group ID.
group User's group name.
histchars=ab A two-character string that sets the characters to use in history-substitution and quick- substitution (default is !^).
histdup={all|prev} Maintain a record only of unique history events (all), or do not enter new event when it is the same as the previous one (prev).
histfile=file History file consulted by history -S and history -L. Default is ~/.history.
histlit Do not expand history lines when recalling them.
history=n format The first word indicates the number of commands to save in the history list. The second indicates the format with which to display that list (tcsh only; see the prompt section for possible formats).
home=dir Home directory of user, initialized from HOME. The ~ character is shorthand for this value.
ignoreeof Ignore an end-of-file (EOF) from terminals; prevents accidental logout.
implicitcd If directory name is entered as a command, cd to that directory. Can be set to verbose to echo the cd to standard output.
inputmode={insert|overwrite} Control editor's mode.
listflags=flags One or more of the x, a, or A options for the ls-F built-in command. Second word can be set to path for ls command.
listjobs=long When a job is suspended, list all jobs (in long format, if specified).
listlinks In ls -F command, include type of file to which links point.
listmax=num Do not allow list-choices to print more than num choices before prompting.
listmaxrows=num Do not allow list-choices to print more than num rows of choices before prompting.
loginsh Set if shell is a login shell.
logout Indicates status of an imminent logout (normal, automatic, or hangup).
mail=(n files) One or more files checked for new mail every 5 minutes or (if n is supplied) every n seconds.
matchbeep={never|nomatch|ambiguous|notunique} Specifies circumstances under which completion should beep: never, if no match exists, if multiple matches exist, or if multiple matches exist and one is exact.
nobeep Disable beeping.
noclobber Don't redirect output to an existing file; prevents accidental destruction of files.
noglob Turn off filename expansion; useful in shell scripts.
nokanji Disable Kanji (if supported).
nonomatch Treat filename metacharacters as literal characters, if no match exists (e.g., vi ch* creates new file ch* instead of printing "No match").
nostat=directory-list Do not stat directory-list during completion.
notify Declare job completions when they occur.
owd Old working directory.
path=(dirs) List of pathnames in which to search for commands to execute. Initialized from PATH; the default is: /usr/ucb /usr/bin
printexitvalue Print all nonzero exit values.
prompt='str' String that prompts for interactive input; default is %. See "Formatting for the Prompt Variable" later in this chapter for formatting information.
prompt2='str' String that prompts for interactive input in foreach and while loops and continued lines (those with escaped newlines). See "Formatting for the Prompt Variable" for formatting information.
prompt3='str' String that prompts for interactive input in automatic spelling correction. See "Formatting for the Prompt Variable" for formatting information.
promptchars=cc Use the two characters specified as cc with the %# prompt sequence to indicate normal users and the superuser, respectively.
pushdsilent Do not print directory stack when pushd and popd are invoked.
pushdtohome Change to home directory when pushd is invoked without arguments.
recexact Consider completion to be concluded on first exact match.
recognize_only_executables When command completion is invoked, print only executable files.
rmstar Prompt before executing the command rm *.
rprompt=string The string to print on the right side of the screen while the prompt is displayed on the left. Specify as for prompt.
savedirs Execute dirs -S before exiting.
savehist=max [merge] Execute history -S before exiting. Save no more than max lines of history. If specified, merge those lines with previous history saves, and sort by time.
sched=string Format for sched's printing of events. See "Formatting for the Prompt Variable" for formatting information.
shell=file Pathname of the shell program currently in use; default is /bin/csh.
shlvl Number of nested shells.
status=n Exit status of last command. Built-in commands return 0 (success) or 1 (failure).
symlinks= {chase|ignore|expand} Specify manner in which to deal with symbolic links. Expand them to real directory name in cwd (chase), treat them as real directories (ignore), or expand arguments that resemble pathnames (expand).
tcsh Version of tcsh.
term Terminal type.
time='n %c' If command execution takes more than n CPU seconds, report user time, system time, elapsed time, and CPU percentage. Supply optional %c flags to show other data.
tperiod Number of minutes between executions of periodic alias.
tty Name of tty, if applicable.
uid User ID.
user Username.
verbose Display a command after history substitution; same as the command csh -v.
version Shell's version and additional information, including options set at compile time.
visiblebell Flash screen instead of beeping.
watch=([n] user terminal...) Watch for user logging in at terminal, where terminal can be a tty name or any. Check every n minutes or 10 by default.
who=string Specify information to be printed by watch.
wordchars=chars List of all nonalphanumeric characters that may be part of a word. Default is *?_-.[]~=.

Formatting for the Prompt Variable

tcsh provides a list of substitutions that can be used in formatting the prompt. (csh allows only plain-string prompts and the ! history substitution shown in the following list.) The list of available substitutions includes:

Sample .cshrc File



# PREDEFINED VARIABLES set path=(~ ~/bin /usr/ucb /bin /usr/bin . ) set mail=(/usr/mail/tom) if ($?prompt) then # settings for interactive use set echo set noclobber ignoreeof set cdpath=(/usr/lib /usr/spool/uucp) # Now I can type cd macros # instead of cd /usr/lib/macros set history=100 set prompt="tom \!% " # includes history number set time=3 # MY VARIABLES set man1="/usr/man/man1" # lets me do cd $man1, ls $man1 set a="[a-z]*" # lets me do vi $a set A="[A-Z]*" # or grep string $A # ALIASES alias c "clear; dirs" # use quotes to protect ; or | alias h "history|more" alias j jobs -l alias ls ls -sFC # redefine ls command alias del 'mv \!* ~/tmp_dir' # a safe alternative to rm endif


Environment Variables

The C shell maintains a set of environment variables, which are distinct from shell variables and aren't really part of the C shell. Shell variables are meaningful only within the current shell, but environment variables are exported automatically, making them available globally. For example, C-shell variables are accessible only to a particular script in which they're defined, whereas environment variables can be used by any shell scripts, mail utilities, or editors you might invoke.

Environment variables are assigned as follows:

setenv VAR value

The following environment variables have corresponding C-shell variables. When either one changes, the value is copied to the other (italics means the variable is specific to tcsh):

Other environment variables, which do not have corresponding shell variables, include the following (italics means the variable is specific to tcsh):