[Chapter 7] 7.11 dirs in Your Prompt: Better than $cwd
Author: Jerry Peek, Tim O'Reilly & Mike Loukides
Date: 1998-08-04T21:33:56Z

#

| Chapter 7 Setting Your Shell Prompt |

## 7.11 dirs in Your Prompt: Better than $cwd

The C shell gives the absolute pathname of your current directory in `$cwd` (14.13). Many people use that in their prompts. If you use the pushd and popd (14.6) commands, you may not always remember exactly what's in your directory stack (I don't, at least). Also, do you want to shorten your home directory pathname to just a tilde (`~`) so it takes less room in the prompt? Here's how: run the dirs command and use its output in your prompt. A simple alias for cd users looks like this:

>     alias cd 'chdir \!* && set prompt="`dirs`% "'

and the prompts look like:

>     /work/project % cd
>     ~ % cd bin
>     ~/bin %

Here's what to put in .cshrc to make a multiline prompt (7.5) that shows the directory stack:

    uname -n
    expr
    # PUT hostname.domain.name IN $hostname AND hostname IN $HOST:
    set hostname=`uname -n`
    setenv HOST `expr $hostname : '\([^.]*\).*'`

    alias setprompt 'set prompt="\\
    ${USER}@${HOST} `dirs`\\
    \! % "'
    alias cd  'chdir \!* && setprompt'
    alias pushd  'pushd \!* && setprompt'
    alias popd  'popd  \!* && setprompt'
    setprompt   # SET THE INITIAL PROMPT

Because bash can run a command each time it sets its prompt, and because it has built-in prompt operators (7.4), the bash version of all the stuff above fits on one line:

    $(...)
    PS1='\n\u@\h $(dirs)\n\! \$ '

That makes a blank line before each prompt; if you don't want that, join the first and second lines of the setprompt alias or remove the first `\n`. Let's push a couple of directories and watch the prompt:

>     jerry@ora ~
>     1 % pushd /work/src/perl
>     /work/src/perl ~

>     jerry@ora /work/src/perl ~
>     2 % cd ../cnews

>     jerry@ora /work/src/cnews ~
>     3 % pushd ~/bin
>     ~/bin /work/src/cnews ~

>     jerry@ora ~/bin /work/src/cnews ~
>     4 %

Warning! | Of course, the prompt looks a little redundant there because each pushd command also shows the dirs output. A few commands later, though, having your directory stack in the prompt will be handy. If your directory stack has a lot of entries, the first line of the prompt can get wider than the screen. In that case, store the dirs output in a shell array (47.5) and edit it with a command like sed or with the built-in csh string editing (9.6).

For example, to show just the tail of each path in the dirs output, use the alias below; the C shell operator `:gt` globally edits all words, to the tail of each pathname:

>     alias setprompt 'set dirs=(`dirs`); set prompt="\\
>     ${USER}@${HOST} $dirs:gt\\
>     \! % "'

Watch the prompt. If you forget what the names in the prompt mean, just type `dirs`:

>     jerry@ora bin cnews jerry
>     5 % pushd ~/tmp/test
>     ~/tmp/test ~/bin /work/src/cnews ~
>        ...
>     jerry@ora test bin cnews jerry
>     12 % dirs
>     ~/tmp/test ~/bin /work/src/cnews ~

There's a related tip in article 47.5: storing the directory stack in an array variable.

- JP

7.10 What Good Is a Blank Shell Prompt? |  | 7.12 External Commands Send Signals to Set Variables