[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