[Chapter 7] 7.4 Faster Prompt Setting with Built-Ins
Author: Jerry Peek, Tim O'Reilly & Mike Loukides
Date: 1998-08-04T21:33:44Z

#

| Chapter 7 Setting Your Shell Prompt |

## 7.4 Faster Prompt Setting with Built-Ins

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:

1. 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.

2. 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).

3. 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$

4. 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.

- JP

7.3 C Shell Prompt Causes Problems in vi, rsh, etc. |  | 7.5 Multiline Shell Prompts