POSIX alias expansion bugs (in bash 1.05)

Moderator, John S. Quarterman std-unix at longway.TIC.COM
Sat Mar 17 08:39:26 AEST 1990

From: Maarten Litmaath <uunet!cs.vu.nl!maart>

In article <1990Mar16.194728.21389 at usenet.ins.cwru.edu> of the newsgroup
gnu.bash.bug, chet at cwns1.CWRU.EDU (Chet Ramey) writes:
)Sorry Maarten, it's not a bug.  It's how aliases are defined to behave.  The
)part I left out (because it's come up here before) is that aliases are 
)expanded when a command is *read*, not when it is executed.  Call that a
)design error, if you like, but bash and ksh do it the same way.

Conclusion: sometimes a `;' and a newline are NOT equivalent.  `Of course',
you might say, but I maintain it's a design bug, because of the unexpected
results.  Why can I say

	for i in *; do foo; done

instead of

	for i in *
	do foo

but not

	alias foo=bar; foo

instead of

	alias foo=bar


)...  Alias expansion is done
)when the command line is tokenized (at least it should be, and I have
)redone expansion so it is -- vanilla bash does expansion on whole lines at
)a time).  So all aliases get expanded before any `alias' commands are
)executed.  [...]

I say: divide the line in logical commands and execute them in turn,
expanding aliases and functions at execution time.  That's far more natural
and I don't think it's much more difficult to program.

)>Bourne shell functions have the correct behavior.
)Bourne shell functions are not a complete replacement for bash/ksh aliases;
)they never will be.  It's possible, for instance, to write an alias
)`remote' such that 'remote x ls -l /bin/*' will pass its arguments to a
)remote machine x for evaluation; that's not possible with functions because
)globbing is done before the function is called.  [...]

Ridiculous!  If I say

	command /bin/*

then I don't want behavior dependent on the nature of `command'!
That's precisely the bug recently discussed in comp.unix.questions:

	$ x=external
	$ x=internal pwd >/dev/null
	$ echo "pwd is an $x command in this version of the shell"

You do NOT repeat NOT want to make the same mistake again!
(And POSIX neither.)

If I want argument evaluation on the remote machine, I will quote the
arguments, thank you!
 1) Will 4.5BSD have wait5()?         |Maarten Litmaath @ VU Amsterdam:
 2) Sleep(3) should be sleep(2) again.|maart at cs.vu.nl, uunet!mcsun!botter!maart

Volume-Number: Volume 19, Number 13

More information about the Comp.std.unix mailing list