To set your prompt, you execute a command (on most shells, the command sets a shell variable). Before setting the prompt, you may run other commands to get information for it: the current directory name, for example. A shell can run two kinds of commands: built-in and external (1.10). Built-in commands usually run faster than external commands. On a slow computer, the difference may be important - waiting a few seconds for your prompt to reset can get irritating. Creative use of your shell's built-in commands might pay off there. Let's look at some examples:
pwd is an external command that
searches the filesystem (14.4)
to find your current directory name.
(pwd is built into some shells, but that version doesn't search the
filesystem.) However,
some shells can give you the current directory name from a variable, usually
$cwd
or $PWD
.
On slow computers, the first prompt-setting command below would take
more time:
`...` | set prompt="`pwd`% " set prompt="${cwd}% " |
---|
There's a tradeoff here, though - the shell built-in
may not (14.13)
give the right answer.
Also, in the C shell, each time you change to a new directory, you need
to run a new set prompt
command; you can use an alias like
setprompt (7.5)
to do this automatically.
If you're putting your current directory in your prompt, you may only
want the tail of the pathname (the name past the last slash).
How can you edit a pathname?
Most people think of
basename (45.18)
or
sed (34.24).
Using the current directory from $cwd
, they might type:
set prompt="`basename $cwd`% "
The faster way is with the C shell's built-in "tail" operator, :t
:
{} | set prompt="${cwd:t}% " |
---|
If your current directory is /usr/users/hanna/projects, either of those prompts would look like this (with a space after the percent sign):
projects%
The C shell has several of these built-in
string operators (9.6)
like :t
;
the Korn Shell and bash have
more-powerful
string operators (9.7).
The Korn shell and bash can include the current value of another
shell variable in their prompt.
So, put
$PWD
(6.3)
in your prompt string (the PS1 shell variable)
and the prompt will always show the current directory.
Or use any other variable; anytime it changes, the prompt will change too.
The important trick is to store the prompt with
single quotes ('
), not double quotes ("
), so that
the variable name in your prompt won't be
evaluated (8.14, 8.5)
until the prompt is actually printed to the screen.
For example, I'll put the current directory and the value of a variable named PSX in my prompt. When I change either, the prompt changes too:
$PSX=foo
$PS1='$PWD $PSX\$ '
/home/jerry foo$PSX=bar
/home/jerry bar$cd ..
/home bar$
tcsh and bash also have special prompt string customizations that let you include the hostname, username, time, and more. You don't need external UNIX commands; you don't need to use an alias like setprompt to reset your prompt string.
For example, to make your shell prompt
show your current directory, a newline character (to move to the next
line of a
two-line prompt (7.5)),
then the current time, and finally a $
or %
:
PS1='$PWD\n\t \$ ' ...bash set prompt = '%~\\ ...tcsh %p%% '
For more information, see O'Reilly & Associates' Using csh & tcsh and Learning the bash Shell-or your shell's manpage.
So, if your prompt takes too long to set, look for built-ins that can save time. As another example, article 7.11 shows how to use dirs in a shell prompt.
-