Avoiding C-Shell Alias Loops (Unix Power Tools, 3rd Edition)
29.8. Avoiding C-Shell Alias Loops
Section 27.9 has similar information for
bash.
Here's a situation
that came up on the Net a while ago. Someone wanted an exit (Section 24.4) alias that
would run a ~/.exit file (Section 31.13) before leaving the shell. The obvious
solution is:
alias exit "source ~/.exit; exit"
This doesn't work; when you use the
exit alias, the C shell thinks that the alias is
trying to execute itself. Recursive aliases
aren't allowed on many shells, so the C shell prints
an error message (Alias loop) and gives up.
There are many ways to break the loop. Here's the
best (in my opinion):
alias exit 'source ~/.exit; ""exit'
Section 27.10 has the hairy details of what
works and why. To summarize, if you need to use the
alias's name within a C shell alias, you can use:
""name
Where name is the name of a built-in (Section 1.9)
command or any "regular" command.
\name
Where name is the name of any
"regular" command, but not a
built-in command.
Tempting as this all may sound
(and I have to admit, if it didn't sound a bit
tempting, I wouldn't be writing this article), I
can't really recommend the practice of
"redefining" commands with aliases.
You should leave the original commands as they are. The original
author could have avoided all these problems by calling his alias
quit rather than exit.
If you redefine commands with aliases and then use another account
where your alias isn't defined,
it's easy for things to go wrong.
That's especially true for commands that do
something permanent -- overwriting or removing files, for example.
It also can cause problems if you let someone type a command on your
account and the person isn't expecting an aliased
version.
Let me give one more example to show you what problems you can have.
Let's say you've aliased the
exit command to source a
.exit file before quitting. Fair enough. But
now, let's say that you're not in
your login shell, that you've set
ignoreeof, and that, for no apparent reason, your
.exit file disappears (maybe it develops a bad
block, so the system can't read it; such things
happen).
Now you're stuck. If you type
exit, the source command will
fail, and the "real"
exit command will never be executed. You
can't leave the shell. Of course, if you remember
what you did, you can always type unalias exit and
get the original command back. Or you can type "
"exit. Or finally, you could simply write the alias such
that it tests for the existence of the file before trying to read it.
But if you've foisted this alias on a beginner, he
or she might not know that. All of a sudden, you're
stuck in some shell that you apparently can't get
out of.
The biggest virtue of Unix is that it's infinitely
extendable. However, you aren't helping if your
extensions hide the basic operations that make everything work.
So -- extend all you want. But when you write your extensions,
give them new names. End of sermon.
-- ML
29.7. Sourceable Scripts29.9. How to Put if-then-else in a C-Shell Alias
Copyright © 2003 O'Reilly & Associates. All rights reserved.
Wyszukiwarka
Podobne podstrony:
ch29ch29 (5)ch29ch29 (7)ch29ch29 (4)ch29ch29Ch29ch29ch29ch29ch29 (2)ch29CH29CH29 (10)więcej podobnych podstron