"Linux Gazette...making Linux just a little more fun!
"
Features of the TCSH Shell
Abstract
In this article, I will describe some of the main features of TCSH, which I
believe makes it worth using as the primary login shell. This article is
not meant to persuade bash users to change! I've never used bash, and by
that reason I know very little about it.
As some of you surely know, I've created a configuration tool called The Dotfile Generator,
which can configure TCSH. I believe that this tool is very handy when one
wants to get the most out of TCSH (without reading the manual page a couple of
times.) Because of that I'll refer to this tool several times throughout
this article to show how it can be used to set up TCSH.
Why is the shell so important?
The shell is your interface to executing program, managing files and
directories etc. Though very few people are aware of it, one uses the shell
very much in the daily work. E.g. completing file names, using history
substitution and aliases. The TCSH shell offers all of
these features and a few more, which the average user very seldom takes
advantages of.
With a high knowledge of your shell's power, you may decrease the time you
need to spend in the shell, and increase the time spent on the original tasks
An important feature that is used by almost all users of a shell is the
command line completion. With this feature you don't need to type
all the letters of a filename, but only the ambiguous ones. This means that
if you wish to edit a file called file.txt, you may only need to
type fi and hit the TAB key, then the shell will type the rest of
the filename for you.
Basically one can complete on files and directories. This means that you
can not complete on host names, process id's, options for a given program
etc. Another thing you can not do with this type of completion is to
complete on directory names only, when typing the argument for the command
cd
In TCSH, the completion mechanism is enhanced so that it is possible to
tell TCSH which list to complete from for each command. This means that
you can tell TCSH to complete from a list of host names when completing
on the commands rlogin and ping. An alternative is to tell
it to complete only on directories when the command is cd.
To configure user defined completion with The Dotfile Generator (from now
on called TDG) go to the page completion -> userdefined,
this will bring up a page which looks like this:
As the command name, you tell TDG which command you wish to define a
completion for. In this example it is rm.
Next you have to tell TDG which arguments to the command, this completion
should apply to. To do this, press the button labeled Position
definition. This will bring up a page, which is split in two parts:
|
In the first part, you tell TDG, that the position definition, should be
defined from the index of the argument, which is trying to be completed
(the one, where the tab key is pressed.) Here you can tell it that you
wish to complete on the first argument, all the arguments except the first
one etc.
|
|
The alternative to position dependent completion is pattern dependent
completion. This means that you can tell TDG, that this completion
should only apply if the current word, the previous word or the word before
the previous word conform with a given pattern.
|
Now you have to tell the TDG which list to complete from. To do this press
the button labeled List. This will bring up a page, where you can
select from a lot of different lists. E.g. aliases, user names, or
directories.
Files and Directories
Four of the lists you can select from are Commands, Directories, File
names and Text files. If you give the optional directory to any
of these, only elements from this directory is used.
Predefined Lists
There are two ways to let completion be from a
predefined list. One is to mark the option predefined list, and
type all the options in this list.
This solution is a bad idea if the list is used several places (e.g. a list
of host names) in that case, one should select the list to be located in a
variable, and then set this variable in the .tcshrc file.
Output from command
In many cases the list should be calculated when the completion
takes place. This could e.g. be a list of users located at a given host, or
targets in a makefile.
To set up such a completion, first develop the command, which return the
list to complete from. The command must return the completion list on
standard output as a space separated list. When this is done, insert this
command in the entry saying Output From Command.
Here's a little Perl command, which find the targets in a makefile:
perl -ne 'if (/^([^.#][^:]+):/) {print "$1 "}' Makefile
If this is inserted in the Entry, one can complete on targets from the file
called Makefile, in the current working directory.
If someone should think that its only to promote TDG, that I describe TCSH
through it, (s)he should take a look at the following line, which is the
generated code for the make completion:
complete make 'p@*@`perl -ne '"'"'if (/^([^.#][^:]+):/) {print "$1"}'"'"'Makefile`@'
Restrict to pattern
With user defined completion, you can restrict the files, which are
matched, for each command. Here are some very useful examples:
- Restrict latex to *.{tex,dtx,ins}
- The latex command will only complete on files ending in
.tex, .dtx or .ins
- Restrict rm to ^*.{tex,html,c,h}
- This means that you can not complete rm to a .tex,
.html, .c or .h file!
I've done that a few times, when I e.g. wanted to delete a file
called important.c~. Since the file important.c existed tcsh only
completed to that name, and.. I deleted the wrong file, because I
was to quick :-(
Additional examples
Additional examples can be obtained from TDG,
if you load the export file distributed with TDG. Please note that if you
wish to keep the other pages, you have to tell TDG only to import the page
completion/userdefined. This is done on the Details page,
which is accessible from the reload page.
Configuring the prompt
Configuring the prompt is very easy with TDG. Just enter the menu called
prompt. On this page you can configure three prompts:
- prompt
- This is the usual prompt, which you see on the command line,
where you are about to enter a command.
- prompt2
- This prompt is used in foreach, and while loops,
and at lines continuing lines ended with a slash.
- prompt3
- This prompt is used when TCSH tries to help you, when it meet
commands it doesn't know (called spell checking.)
The prompts are mixed with tokens and ordinary text. The tokens are
inserted by clicking on them in the menu below the scrollbar, and the
ordinary text is simply typed in. When a token is inserted an indication will
be shown in the entry. Here's an example of how this may look:
| As has been discussed in issue6 of the Gazette,
some of the prompt may be located in the xterm title bar instead of on the
command line. To do this, choose font change and select
Xterm.
|
|
History
The history mechanism of the shell is a valuable thing, which makes it
easier to type similar commands after each other.
To see a list of the previously executed commands, type history.
The following table lists the event specifiers:
!n | This refers to the history event, with index n |
!-n | This refers to the history event, which was executed, n
times ago: !-1 for the previous command, !-2 for the one
before the previous command etc. |
!! | This refers to the previous command |
!# | This refers to the current command |
!s | This refers to the most recent command, whose first word begins
with the string s |
!?s? | This refers to the most recent command, which contain the sting
s |
With these commands, you can re-execute a command.
E.g. just type !!, to re-execute the previous command.
This is however often not what you want to do. What you really wants is to
re-execute some part of a previous command, with some new elements added. To
do this, you can use one of the following word designators, which is
appended to the event specifier, with a colon.
0 | The first word (i.e. the command name) |
n | The nth word |
$ | The last argument |
% | The word matched by an ?s? search |
x-y | Argument range from x to y |
* | All the arguments to the command (equal to ^-$) |
Now it's possible to get the last argument from the previous command, by
typing !!:$. You'll however often see that you very often refer to
the previous command, so if no event specifier is given, the previous
command is used. This means that instead of writing !!:$, you
may only write !$.
More words designators exists, and it's even possible to edit the words with
different commands. For more information about this and for more examples,
please take a look into the tcsh manual
| It is possible to expand the history
references on the command line before you evaluate them by pressing
ESC-SPC or ESC-! (This is: first the escape key, and
next the space key or the ! key). On some keyboards you may use the
meta key instead of the escape key. I.e. M-SPC (One keystroke!)
|
|
Patterns
Many operations in the shell often works on many files, e.g. all files
ending with .tex or starting with test-. Tcsh has the
opportunity to type all these files for you, with file patterns. The
following list shows which possibilities there exists:
* | Match any number of characters |
? | Match a single character |
[...] | Match any single character in the list |
[x-y] | Match any character within the range of
characters from x to y |
[^...] | Match elements, which does not match
the list |
{...} | This expands to all the words
listed. There's no need that they match. |
^... | ^ in the beginning of a pattern
negates the pattern. |
Examples
- match all files ending with .tex
- *.tex
- match all files which does not end with .tex
- ^*.tex
- match xxxabyy xxxcdeyy and xxxhifjyy
- xxx{ab,cde,hifj}yy
- match all .c and .h files
- *.[ch] or *.{c,h}
The shell expand patterns
An important thing to be aware of is that it is the shell, which expand the
patterns, and not the programs, which is executed with the pattern.
An example of this is the program mcopy which copy files from
disk. To copy all files, you may wish to use a star as in: mcopy a:*
/tmp. This does however not work since the shell will try to
expand the star, and since it can not find any files, which starts with
a:, it will signal an error. So if you wish to send a star to the
program, you have to escape the star: mcopy a:\* .
There exists two very useful key bindings, which can be
used with patterns: The first is C-xg, which list all the files
matching the pattern, without executing the command. The other is
C-x*, which expand the star on the command line. This is
especially useful if you e.g. wishes to delete all files ending in .c except
important.c, stable.c and another.c. To create a
pattern for this, might be very hard, so just use the pattern
*.c. Then type C-x*, which will expand *.c to
all you .c files. Now it's easy to remove the three files from the list
Aliases
When using the shell one will soon recognize that certain commands are
typed again and again. The one at top ten is surly ls -la, which
list all files in a directory in long form.
TCSH has a mechanism to create aliases for commands. This means that you can
create an alias for ls -la just called la.
Aliases may refer to the arguments of the command line. This means that you
can create a command called pack, which take a directory name and pack the
directory with tar and gz. etc.
Aliases can often be a bit hard to create since one often wants
history/variable references expanded at time of use, and not at the
definition time. This has been done easier with TDG, so go to the page
aliases, to define aliases. If you end up with an alias you can
not define on this page, but in tcsh, please send me an email. For more information about
aliases, see the tcsh manual
Timing programs
Have you ever needed to know how long a program took to run, how much CPU
it used etc?. If so, you may recognize the output from the tcsh built-in time command:
0.020u 0.040s 0:00.11 54.5% 0+0k 0+0io 21pf+0w
Informative? Yes but... The gnu time command is a bit more understandable:
0.01user 0.08system 0:00.32elapsed 28%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+0minor)pagefaults 0swaps
But still...
In TDG you can configure the output from the time command on the page
called jobs. It looks like this:
As for the prompt, here's an entry once again for mixed tokens and and
ordinary text. Remember, if there is something in TDG that you do not
understand, help is available by pressing the right mouse button over the
given widget.
References
As you may have guessed, TDG and this article will help you a lot of the
way to use TCSH, BUT you may need to read a bit more to get more out
of TCSH, here's a few references:
Jesper Kjær Pedersen <blackie@imada.ou.dk>
Copyright © 1996, Jesper Kjær Pedersen
Published in Issue 12 of the Linux Gazette