The C shell's
brain damage (
47.2
)
keeps you from using an
if
(
47.3
)
with an
else
in an alias. You have to use a
sourceable script (
10.5
)
. Or that's what I thought until I saw an article by Lloyd Zusman on
comp.unix.questions
in December 1987. He'd saved an earlier posting on that group (but without its author's name) that showed how. The trick: use enough backslashes (
\
) and the
eval
(
8.10
)
command.
As an example, here's an alias named
C
for
compiling (
52.8
)
C programs. It needs the
executable
filename (like
C prog
), not the source filename (like
C prog.c
). If you type a filename ending in
.c
, it complains and quits. Else, it:
Renames any old prog file to prog.old ,
Prints the message
prog
SENT TO cc
,
Compiles prog.c ,
And - if there's a prog file (if the compile succeeded)-runs chmod 311 prog to protect the file from accidental reading with a command like cat * or more * .
Your alias doesn't need to be as complicated. But this one shows some tricks, like putting an
if
inside the
if
, that you might want to use. The expressions like
=~
and
-e
are explained in article
47.4
.
Watch your quoting - remember that the shell strips off one level of quoting
when you set the alias (
10.3
)
and another during the first pass of the
eval
. Follow this example and you'll probably be fine:
# COMPILE AND chmod C PROGRAMS; DON'T USE .c ON END OF FILENAME. alias C 'eval "if (\!* =~ *.c) then \\ echo "C quitting: no .c on end of \!* please." \\ else \\ if (-e \!*) mv \!* \!*.old \\ echo \!*.c SENT TO cc \\ cc -s \!*.c -o \!* \\ if (-e \!*) chmod 311 \!* \\ endif"'
-