[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Possible Bug in BASH

From: Matthew Strax-Haber
Subject: Re: Possible Bug in BASH
Date: Wed, 24 Feb 2010 23:05:25 -0800

On Jun 20, 2009, at 3:47 PM, Bob Proulx wrote:

> 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.
Perhaps it is not a bug, but if it is not then the documentation is 
inconsistent with the behavior.

>> 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.
I understand what is happening and why, but from my understanding either the 
implementation should be changed or the documentation made more precise.

> 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
~ Matthew Strax-Haber
Northeastern University

reply via email to

[Prev in Thread] Current Thread [Next in Thread]