std-unix@longway.TIC.COM (Moderator, John S. Quarterman) (03/17/90)
From: Maarten Litmaath <uunet!cs.vu.nl!maart> In article <1990Mar16.194728.21389@usenet.ins.cwru.edu> of the newsgroup gnu.bash.bug, chet@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 done but not alias foo=bar; foo instead of alias foo=bar foo ? )... 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@cs.vu.nl, uunet!mcsun!botter!maart Volume-Number: Volume 19, Number 13