Como a documentação POSIX permite isso como uma extensão, não há nada que impeça a implementação desse comportamento.
Uma simples verificação (executada em zsh
):
$ for shell in /bin/*sh 'busybox sh'; do
printf '[%s]\n' $shell
$=shell -c 'á() { :; }'
done
[/bin/ash]
/bin/ash: 1: Syntax error: Bad function name
[/bin/bash]
[/bin/dash]
/bin/dash: 1: Syntax error: Bad function name
[/bin/ksh]
[/bin/lksh]
[/bin/mksh]
[/bin/pdksh]
[/bin/posh]
/bin/posh: á: invalid function name
[/bin/yash]
[/bin/zsh]
[busybox sh]
sh: syntax error: bad function name
mostra que bash
, zsh
, yash
, ksh93
(a qual ksh
está vinculada no meu sistema), pdksh
e sua derivação permitem caracteres com vários bytes como nome da função.
yash
foi projetado para oferecer suporte a caracteres de vários bytes desde o começo, por isso não é surpresa que funcionou .
A outra documentação que você pode consultar é ksh93
:
A blank is a tab or a space. An identifier is a sequence of letters, digits, or underscores starting with a letter or underscore. Identifiers are used as components of variable names. A vname is a sequence of one or more identifiers separated by a . and optionally preceded by a .. Vnames are used as function and variable names. A word is a sequence of characters from the character set defined by the current locale, excluding non-quoted metacharacters.
Então, definindo como C
locale:
$ export LC_ALL=C
$ á() { echo 1; }
ksh: á: invalid function name
falha.