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