## 4.7. Multiline Shell Prompts

Lots of people like lots of information in their prompts: hostname, directory name, history number, and maybe username. Lots of people have spent lots of time trying to make their prompts short enough to fit across the screen and still leave room for typing a command longer than ls:

>     <elaineq@applefarm> [/usr/elaineq/projects/april/week4] 23 % ls

Even with fairly short prompts, if you look back at a screen after running a few commands, telling the data from the prompts can be a little tough (real terminals don't show user input in boldface, so I won't do it here either):

>     +<elaineq@applefarm> [~] 56% cd beta
>     <elaineq@applefarm> [~/beta] 57% which prog
>     /usr/tst/applefarm/bin/beta/prog
>     <elaineq@applefarm> [~/beta] 58% prog
>     61,102 units inventoried; 3142 to do
>     <elaineq@applefarm> [~/beta] 59%

Go to http://examples.oreilly.com/upt3 for more information on: mlprompt.cshmlprompt.sh

One nice answer is to make a prompt that has more than one line. Here's part of a .cshrc file that sets a three-line prompt: one blank line, one line with the hostname and current directory, and a third line with the history number and a percent sign. (If this were a tcsh, I could have gotten the hostname with `%m`.) The C shell quoting (Section 27.13) is ugly -- doubly ugly because the prompt is set inside an alias -- but otherwise it's straightforward:

`uname -n` Section 2.5, `{..}` Section 35.9

>     set hostname=`uname -n`
>     alias setprompt 'set prompt="\\
>     ${hostname}:${cwd}\\
>     \! % "'
>     alias cd 'chdir \!* && setprompt'
>     alias pushd 'pushd \!* && setprompt'
>     alias popd 'popd \!* && setprompt'
>     setprompt           # to set the initial prompt

(There's a version on the Web for Bourne-type shells.) The prompts look like this:

>     applefarm:/usr/elaineq/projects/april/week4
>     23 % prog | tee /dev/tty | mail -s "prog results" bigboss@corpoffice
>     61,102 units inventoried; 3142 to do

>     applefarm:/usr/elaineq/projects/april/week4
>     24 % cd ~/beta

>     applefarm:/usr/elaineq/beta
>     25 % prog | mail joanne

The blank lines separate each command -- though you may want to save space by omitting them. For example, Mike Sierra of O'Reilly & Associates has used a row of asterisks:

>     ***** 23 *** <mike@mymac> *** ~/calendar *****
>     % cd Sep*
>     ***** 24 *** <mike@mymac> *** ~/calendar/September *****
>     %

Other shells have different syntax, but the idea is the same: embed newlines to get multiline prompts. In Bourne-type shells you'll need zero or one backslash before each newline; Section 27.12 explains. In bash, put a `\n` (which stands for a newline character) anywhere you want the prompt to break to a new line.

What I like best about multiline prompts is that you get a lot of information but have the whole screen width for typing. Of course, you can put different information in the prompt than I've shown here. The important idea is that if you want more information and need room to type, try a multiline prompt.

--JP and SJC

Copyright © 2003 O'Reilly & Associates. All rights reserved.