The Unix shell reads a number of configuration files when it starts up. These configuration files are really shell programs , so they are extraordinarily powerful. Shell programming is beyond the scope of this book. For more detail, see Paul DuBois’ book Using csh and tcsh (O’Reilly). Because Unix is a multiuser system, there are two possible locations for the configuration files: one applies to all users of the system and another to each individual user.
The system-wide setup files that are read by tcsh , the default shell for Mac OS X, are found in /etc (csh.login, csh.cshrc, and csh.logout). You only have permission to change these system-wide files if you use sudo (see Section 2.3). However, you can create an additional file called .tcshrc in your home directory that will add additional commands to be executed whenever you start a new Terminal window. (If you configure Terminal to use another shell, such as the Bourne shell, the C shell, or the Z shell, you’ll need to set up different configuration files, which we don’t discuss.) The system-wide setup files are read first, then the user-specific ones, so commands in your .tcshrc file may override those in the system-wide files.
The .tcshrc file can contain any shell command that you want to run automatically whenever you create a new Terminal. Some typical examples include changing the shell prompt, setting environment variables (values that control the operation of other Unix utilities), setting aliases, or adding to the search path (where the shell searches for programs to be run). A .tcshrc file could look like this:
set prompt="%/ %h% " setenv LESS 'eMq' alias desktop "cd ~/Desktop" date
This sample .tcshrc file issues the following commands:
The line with
the shell to use a different prompt than the standard one.
We’ll explain the details of prompt setting in
Section 4.2.1 later in this
The line with
less program which options you want to set
every time you use it. Not all commands recognize environment
variables, but for those that do, this saves you the trouble of
typing the options on every
less command line.
Environment variables have many uses within Unix. A good place to
learn more about them is the book Unix Power
Tools, by Jerry Peek, Tim O’Reilly, and
Mike Loukides (O’Reilly).
The line that begins with
defines a new, custom command that your shell will recognize just as
if it were a built-in Unix command. Aliases are a great way to save
shorthand names for long, complicated Unix command lines, or even to
fix common mistakes you might make when typing command lines. This
particular alias creates a command for going right to the Desktop
directory. We give a brief tutorial on creating aliases later in this
date line simply runs the
date command to print the time and date when you
open a new Terminal window. You probably don’t want
to do this, but we want you to understand that you can put in any
command that you could type at the shell prompt, and have it
automatically executed whenever a new shell starts up.
By default, the .tcshrc file doesn’t exist in your home directory. Only the system-wide configuration files are read. But if you create the file, it will be read and its contents executed the next time you start a shell. (You can also create a file called .logout to contain commands to be executed when you end a shell.) You can create or change these files with a text editor, such as vi (see Section 3.3.2). Don’t use a word processor that breaks long lines or puts special nontext codes into the file. Any changes you make to these files will take effect when you open a new Terminal window. Unfortunately, it’s not always easy to know which shell setup file you should change. And an editing mistake in your shell setup file can interfere with the normal startup of the Terminal window. We suggest that beginners get help from experienced users, and don’t make changes to these files at all if you’re about to do some critical work with your account, unless there’s some reason you have to make the changes immediately.
You can execute any customization command we show you here from the command line as well. In this case, the changes are in effect only until you close that window or quit Terminal.
For example, to change the default options for
less so it will clear the Terminal window before
it shows each new page of text, you could add the
-c option to the
environment variable. The command would look something like this:
setenv LESS 'eMqc'
(If you don’t want some of the
less options we’ve shown, you
could leave those letters out.) Unix has many other configuration
commands to learn about; the sources listed in Chapter 10 can help.
Just as you can execute the setup commands from the command line, the
converse is true: any command that you can execute from the command
line can be executed automatically when you log in by placing it in
your setup file. (Running interactive commands such as
ftp from your setup file
isn’t a good idea, though.)
The easiest customization you can perform is to change your prompt.
on Mac OS X has a shell prompt
made up of your computer hostname, your account name, and a percent
sign (for example:
taylor%). If you’d rather have
something else, it’s time to edit your own
.tcshrc file. Use the vi editor (you might need
to flip back to Section 3.3.2) to create a file called
.tcshrc in your home directory
/Users/yourname) and add the following to the
end of the file:
". You can also change the prompt for a single
session by invoking the command as follows:
set prompt="% "%
This command will give you a simple, spare
prompt with nothing else. (The
% is traditional
for shells derived from the Berkeley Unix C Shell, while
$ is traditional for shells derived from the
original Bell Labs Bourne Shell.) It’s not
necessary — you could use a colon, a greater-than sign, or any
other prompt character — but it is a nice convention, because it
will immediately tell an advanced user what kind of shell you are
If that’s all you could do to set your prompt, it wouldn’t be very interesting, though. There are a number of special character sequences that, when used to define the prompt, cause the shell to print out various bits of useful data. Table 4-1 shows a partial list of these special character sequences for fine tuning your prompt.
Table 4-1. Favorite percent escape sequences for tcsh prompts
The current working directory
The current working directory, with your home represented as
The trailing element of the current working directory, with
The current command history number
The full hostname
The hostname up to the first dot
Start/stop bold mode (matches the bold color in the Terminal color preferences)
Time of day in 12-hour (a.m./p.m.) format
Time of day in 24-hour format
Experiment and see what you can create that will meet your needs and be fun too. For many years, a popular Unix prompt was:
set prompt="Yes, Master? "
It might be a bit obsequious, but on the other hand, how many people in your life call you “Master”?
One prompt sequence that we like is:
set prompt="%/ %h% "
This prompt sequence shows the current working directory, followed by
a space, and the current history number, and then a percent sign to
remind the user that this is
tcsh. For example, the prompt might read:
This tells me immediately that
my current directory, and that I’m on the 55th
command I’ve executed. (Because you can use the
arrow keys to scroll back to previous commands, as described in Section 1.1.3, this is no longer as
important, but there is a very powerful command history syntax built
into tcsh that allows you to recall a previous
command by number. If you’re familiar with this
syntax, making the command history number part of the prompt can be
handy.) On multiuser systems, it’s not a bad idea to
put the username into the prompt as well, so you always know who the
system thinks you are.
The flexibility of Unix is simultaneously its greatest strength and downfall; the operating system can do just about anything you can imagine (the command-line interface is certainly far more flexible than Aqua, the graphical interface!) but it’s very difficult to remember every single flag to every command. That’s where shell aliases can be a real boon. A shell alias is a simple mechanism that lets you create your own command names that act exactly as you desire.
For example, we really like the
-a flag to be
included every time we list a directory with
so we created an alias:
alias ls "/bin/ls -a"
This indicates that each time we type
ls in the
/bin/ls command is going to be run, and
it’s going to automatically have the
-a flag specified. To have this available in your
next session, make sure you remember to add the alias to your
.tcshrc file too.
You can also have aliases that let you jump quickly to common locations, a particularly helpful trick when in Mac OS X:
alias desktop "cd ~/Desktop"
Chapter 3 described the
rm commands. Each of
these support the
-i switch, which will prompt you
before overwriting or deleting a file. You can use aliases to always
enable this switch:
alias rm "rm -i"%
alias cp "cp -i"%
alias mv "mv -i"
You can list active aliases all by typing
without any arguments:
aliascp cp -i desktop cd ~/Desktop ls /bin/ls -a m2u (tr '\015' '\012' ) mv mv -i rm rm -i u2m (tr '\012' '\015' )
Have an alias you really want to omit? You can use
unalias for that. For example,
ls would remove the
-a flag addition.
To type the
^[ characters in
tcsh, use the key sequence Control-V Escape
(press Control-V and release, then press the Escape key). To type
^G, use Control-V Control-G. The vi editor
supports the same key sequence.
Such cryptic sequences of characters are called ANSI escape
. An ANSI escape sequence is a special
command that manipulates some characteristic of the Terminal, such as
^[ is the ASCII ESC character (which
begins the sequence), and
^G is the ASCII BEL
character. (The BEL character is used to ring the Terminal bell, but
in this context, it terminates the escape sequence.)
You can capture this escape sequence in a shell alias:
% alias settitle 'echo -n "^2;\!*^G"'
Then you can change the title by issuing this command:
your fancy title here
AppleScript is a
powerful programming language used to automate Mac OS X applications.
The Mac OS X Terminal is one such application. You can run
AppleScript commands at the shell prompt using the
character tells the shell that you
want to enter a single command on several lines (when you use this,
the shell will prompt you with a
osascript -e \ 'tell app "Terminal" to set
optionof first window to
For example, to minimize your current Terminal window:
osascript -e \?
'tell app "Terminal" to set miniaturized of first window to true'%
For a complete list of properties you can manipulate with
AppleScript, open the Script Editor
/Applications/AppleScript) and select File
→ Open Dictionary. Open the Terminal dictionary and examine
the properties available under window. If a
property is marked
[r/o], it is read-only, which
means you can’t modify it on the fly.
 In addition to
.tcshrc, the shell will also read and execute
files are read by login shells and others by non-login shells. Some
are read by subshells, others aren’t. Some terminal
windows open login shells, others don’t. And if
you’re using the Bourne shell, still other files,
.profile, are read instead. We focus
.tcshrc here, but a more advanced Unix
book can provide more information once you need it.