Most of the features common to both bash and tcsh are derived from the original C Shell:
Because the chapters on bash discuss these features in detail, this section focuses on the differences between the bash and tcsh implementations.
Command Line Expansion (Substitution)
Refer to "Processing the Command Line" on page 321 for an introduction to command line expansion in the Bourne Again Shell. The tcsh man page uses the term substitution instead of expansion, which is used by bash. The TC Shell scans each token for possible expansion in the following order:
The TC Shell assigns a sequential event number to each command line. You can display this event number as part of the tcsh prompt (refer to "prompt" on page 360). Examples in this section show numbered prompts when they help illustrate the behavior of a command.
As in bash, the tcsh history builtin displays the events in your history list. The list of events is ordered with the oldest events at the top. The last event in the history list is the history command that displayed the list. In the following history list, which is limited to ten lines by the argument of 10 to the history command, command 23 modifies the tcsh prompt to display the history event number. The time each command was executed appears to the right of the event number.
32 $ history 10 23 23:59 set prompt = "! $ " 24 23:59 ls -l 25 23:59 cat temp 26 0:00 rm temp 27 0:00 vim memo 28 0:00 lpr memo 29 0:00 vim memo 30 0:00 lpr memo 31 0:00 rm memo 32 0:00 history
The same event and word designators work in both shells. For example, !! refers to the previous event in tcsh, just as it does in bash. The command !328 executes event number 328 and !?txt? executes the most recent event containing the string txt. For more information refer to "Using an Exclamation Point (!) to Reference Events" on page 299. Table 9-1 lists the few tcsh word modifiers not found in bash.
You can use more than one word modifier in a command. For instance, the a modifier, in combination with the u or l modifier, enables you to change the case of an entire word.
tcsh $ echo $VERSION VERSION: Undefined variable. tcsh $ echo !!:1:al echo $version tcsh 6.12.00 (Astron) 2002-07-23 (powerpc-apple-darwin) options 8b,...
In addition to using event designators to access the history list, you can use the command line editor to access, modify, and execute previous commands (page 350).
The variables that you set to control history in tcsh are different from those used in bash. Whereas bash uses HISTSIZE and HISTFILESIZE to determine the number of events that are preserved during and between sessions, tcsh uses history and savehist Table 9-2 for these purposes.
history and savehist
When you exit from a tcsh shell, the most recently executed commands are saved in your ~/.history file. The next time you start the shell this file initializes the history list. The value of the savehist variable determines the number of lines saved in the .history file (not necessarily the same as the history variable). If savehist is not set, tcsh does not save history between sessions. The history and savehist variables must be local (declared with set, not setenv). The history variable holds the number of events remembered during a session and the savehist variable holds the number remembered between sessions. See Table 9-2.
If you set the value of history too high, it can use too much memory. If it is unset or set to zero, the shell does not save any commands. To establish a history list of the 500 most recent events, give the following command manually or place it in your ~/.tcshrc startup file:
tcsh $ set history = 500
The following command causes tcsh to save the 200 most recent events across login sessions:
tcsh $ set savehist = 200
You can combine these two assignments into a single command:
tcsh $ set history=500 savehist=200
After you set savehist you can log out and log in again, and the 200 most recent events from the previous login sessions will appear in your history list. Set savehist in your ~/.tcshrc file if you want to maintain your event list from login to login.
If you set the variable histlit (history literal), history displays the commands in the history list exactly as they were typed in without any shell interpretation. The following example shows the effect of this variable (compare the lines numbered 32):
tcsh $ cat /etc/csh.cshrc ... tcsh $ cp !!:1 ~ cp /etc/csh.cshrc ~ tcsh $ set histlit tcsh $ history ... 31 9:35 cat /etc/csh.cshrc 32 9:35 cp !!:1 ~ 33 9:35 set histlit 34 9:35 history tcsh $ unset histlit tcsh $ history ... 31 9:35 cat /etc/csh.cshrc 32 9:35 cp /etc/csh.cshrc ~ 33 9:35 set histlit 34 9:35 history 35 9:35 unset histlit 36 9:36 history
The alias/unalias feature in tcsh closely resembles its counterpart in bash (page 311). However, the alias builtin has a slightly different syntax:
alias name value
The following command creates an alias for ls:
tcsh $ alias ls "ls -lF"
The tcsh alias lets you substitute command line arguments, whereas bash does not:
$ alias nam "echo Hello, \!^ is my name" $ nam Sam Hello, Sam is my name
The string \!* within an alias expands to all command line arguments:
$ alias sortprint "sort \!* lpr"
The next alias displays its second argument:
$ alias n2 "echo \!:2"
Some alias names, called special aliases, have special meaning to tcsh. If you define an alias with one of these names, tcsh executes it automatically as explained in Table 9-3. Initially all special aliases are undefined.
To see a list of current aliases, give the command alias. To view the alias for a particular name, give the command alias followed by the name.
History Substitution in Aliases
You can substitute command line arguments by using the history mechanism, where a single exclamation point represents the command line containing the alias. Modifiers are the same as those used by history (page 299). In the following example, the exclamation points are quoted so that the shell does not interpret them when building the aliases:
21 $ alias last echo \!:$ 22 $ last this is just a test test 23 $ alias fn2 echo \!:2:t 24 $ fn2 /Users/jenny/test /Users/alex/temp /Users/barbara/new temp
Event 21 defines for last an alias that displays the last argument. Event 23 defines for fn2 an alias that displays the simple filename, or tail, of the second argument on the command line.
Job control is similar in both bash (page 272) and tcsh. You can move commands between the foreground and background, suspend jobs temporarily, and get a list of the current jobs. The % character references a job when followed by a job number or a string prefix that uniquely identifies the job. You will see a minor difference when you run a multiple-process command line in the background from each shell. Whereas bash displays only the PID number of the last background process in each job, tcsh displays the numbers for all processes belonging to a job. The example from page 272 looks like this under tcsh:
tcsh $ find . -print | sort | lpr & grep -l alex /tmp/* > alexfiles &  18839 18840 18841  18876
The TC Shell expands the characters *, ?, and  in a pathname just as bash does (page 133). The * matches any string of zero or more characters, ? matches any single character, and  defines a character class, which is used to match single characters appearing within a pair of brackets.
The TC Shell expands command line arguments that start with a tilde (~) into filenames in much the same way that bash does (page 348), with the ~ standing for the user's home directory or the home directory of the user whose name follows the tilde. The bash special expansions ~+ and ~ are not available in tcsh.
Brace expansion (page 323) is available in tcsh. Like tilde expansion, it is regarded as an aspect of filename substitution even though brace expansion can generate strings that are not the names of actual files.
In tcsh and its predecessor csh, the process of using patterns to match filenames is referred to as globbing and the pattern itself is called a globbing pattern. If tcsh is unable to identify one or more files that match a globbing pattern, it reports an error (unless the pattern contains a brace). Setting the shell variable noglob suppresses filename substitution, including both tilde and brace interpretation.
Manipulating the Directory Stack
Directory stack manipulation in tcsh does not differ much from that in bash (page 275). The dirs builtin displays the contents of the stack, and the pushd and popd builtins push directories onto and pop directories off of the stack.
The $(...) format for command substitution is not available in tcsh. In its place you must use the original '...' format. Otherwise, the implementation in bash and tcsh is identical. Refer to page 327 for more information on command substitution.