[prev in list] [next in list] [prev in thread] [next in thread]
List: bash-bug
Subject: Re: Possible Bug in BASH
From: Bob Proulx <bob () proulx ! com>
Date: 2009-06-20 22:47:09
Message-ID: 20090620224709.GA2169 () dementia ! proulx ! com
[Download RAW message or body]
Matthew Strax-Haber wrote:
> I think I may have found a bug in BASH 3.2.17(1)-release on a mac.
I am not sure it is a bug but it does seem ood.
> Below is a simple demonstration of the unexpected behavior:
>
> SHELL 1:
> mattsh$ alias c=clear
> mattsh$ c () { echo foo; }
> mattsh$ clear
> foo
Here c is the first word. So it is replaced by the alias. (I didn't
know this behavior before. This is actually really surprising
behavior to me since I didn't expect a function definition to be a
simple command.)
> SHELL 2:
> mattsh$ alias c=clear
> mattsh$ function c () { echo foo; }
> mattsh$ clear
> [blanks screen]
Here function is the first word.
Useful in this context is 'type -a c' and type -a clear' to view the
list of possible definitions of c and clear.
> The documentation for 'function' states:
> function: function NAME { COMMANDS ; } or NAME () { COMMANDS ; }
> Create a simple command invoked by NAME which runs COMMANDS.
> Arguments on the command line along with NAME are passed to the
> function as $0 .. $n.
>
> According to this, "function NAME { COMMANDS ; }" and "NAME () { COMMANDS
> ; }" should be equivalent.
Yes. But the documentation for alias says:
Aliases allow a string to be substituted for a word when it is
used as the first word of a simple command.
And the definition of reserved words says:
Reserved words are words that have a special meaning to the
shell. The following words are recognized as reserved when
unquoted and either the first word of a simple command (see
SHELL GRAMMAR below) or the third word of a case or for
command:
! case do done elif else esac fi for function if in select then
until while { } time [[ ]]
Therefore function is a reserved word when it is used as the first
word of a simple command. Meaning to me that the name c can't be the
first word in that case because function is the first word. Meaning
that c isn't replaced by the alias in that case. It is only replaced
when it is the first word.
Using aliases in this way seems really warped to me. I would avoid it
for the clarity of code. Aliases are really an old paradigm from csh
days. Functions in more modern shells completely replace the need for
aliases.
Bob
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic