## 28.12. Multiline Commands, Secondary Prompts

All shells support multiline commands. In Bourne-type shells, a newline following an open quote (`'` or `"`), pipe symbol (`|`), or backslash (`\`) will not cause the command to be executed. Instead, you'll get a secondary prompt (from the PS2 shell variable, set to `>` by default), and you can continue the command on the next line. For example, to send a quick write (Section 1.21) message without making the other user wait for you to type the message, try this:

>     $ echo "We're leaving in 10 minutes. See you downstairs." |
>     > write joanne

In the C shells, you can continue a line by typing a backslash (\) before the newline (Section 27.13). In tcsh, you'll see a secondary prompt, a question mark (`?`), on each continued line. The original csh doesn't prompt in this case.

Obviously, this is a convenience if you're typing a long command line. It is a minor feature and one easily overlooked; however, it makes it much easier to use a program like sed (Section 34.1) from the command line. For example, if you know you chronically make the typos "mvoe" (for "move") and "thier" (for "their"), you might be inspired to type the following command:

`nroff -ms` Section 3.21, `lp` Section 45.2

>     $ sed '
>     > s/mvoe/move/g
>     > s/thier/their/g' myfile | nroff -ms | lp

More importantly, the ability to issue multiline commands lets you use the shell's programming features interactively from the command line. In both the Bourne and C shells, multiline programming constructs automatically generate a secondary prompt (`>` in Bourne shells and `?` in C shells) until the construct is completed. This is how our favorite programming constructs for non-programmers, the for and foreach loops (Section 28.9), work. While a simple loop could be saved into a shell script (Section 1.8), it is often even easier to use it interactively.

Here's an example with zsh, which makes secondary prompts that show the names of the construct(s) it's continuing. This for loop prints files from the current directory. If a filename ends with .ps, it's sent straight to the ps printer. Filenames ending with .tif are sent through netpbm (Section 45.19) filters, then to the ps printer.

`case` Section 35.10, `echo` Section 27.5

>     zsh% for file in *
>     for> do case "$file" in
>     for case> *.ps) lpr -Pps "$file" ;;
>     for case> *.tif) tifftopnm "$file" | pnmtops | lpr -Pps ;;
>     for case> *) echo "skipping $file" ;;
>     for case> esac
>     for> done
>     skipping README
>       ...
>     zsh%

zsh's multiline editing makes it easy to go back and edit that multiline nested construct. In other shells, you might consider using a throwaway script or copying and pasting with a mouse if you have one.

--TOR and JP

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