17.11.2024 20:27, Kirill A. Korinsky пишет:
> On Sun, 17 Nov 2024 17:52:26 +0100,
> Jeremie Courreges-Anglas <[email protected]> wrote:
>>
>> See main.c:
>> /* Aliases that are builtin commands in at&t */
>> "login=exec login",
>>
>> I guess a builtin would be slightly cleaner, but it means more code.
>>
>
> Indeed, the bug can be reproduced only when I use a builtin alias which has
> space in it's definition:
The problem is defining a function with the same name as an alias that expands
to more than one word, just containing a space is not enough:
$ alias nohup r
nohup='nohup '
r='fc -s'
$ nohup() {}
$ r() {}
sh: syntax error: `(' unexpected
I can't say right away what the shell is supposed to do here and/or what it
really does; looks like it expands the alias and before function definition.
'unalias r' works only interative shells:
$ unalias r
$ r() {}
$ type r
r is a function
$ sh -c 'unalias r; r() {}'
sh: syntax error: `(' unexpected
You can also escape the function name instead, but then the alias still
takes precedence:
$ type r
r is an alias for 'fc -s'
$ \r() {}
$ type r
r is an alias for 'fc -s'
>
> ksh $ echo 'integer() { }' | ksh -n -
> ksh: <stdin>[1]: syntax error: `(' unexpected
> ksh $ echo 'nohup() { }' | ksh -n -
> ksh $ echo 'history() { }' | ksh -n -
> ksh: <stdin>[1]: syntax error: `(' unexpected
> ksh $ echo 'local() { }' | ksh -n -
> ksh $
>