O uso de caracteres Unicode estendidos é (sem dúvida) útil para muitos usuários.
Os shells mais simples (ash (busybox), traço) e o ksh falham com:
tést() { echo 34; }
tést
Mas bash , mksh , lksh e zsh parecem permitir isso.
Estou ciente de que os nomes de funções válidas do POSIX usam essa definição de Nomes . Isso significa esta regex:
[a-zA-Z_][a-zA-Z0-9_]*
No entanto, no primeiro link também é dito:
Uma implementação pode permitir outros caracteres em um nome de função como uma extensão.
As perguntas são:
- Isso é aceito e documentado?
- Onde?
- Para quais conchas (se houver)?
Perguntas relacionadas:
É possível usar caracteres especiais em um nome de função shell?
Não estou interessado em usar meta-caracteres (>) em nomes de funções.
Nomes de funções iniciantes e bash contendo “-”
Não acredito que um operador (subtração "-") deva fazer parte de um nome.
alias
que é um pouco mais branda. e, assim, você pode escrever a função com um nome apropriado e abotoado e definir um alias com um nome mais elegante para chamar a função. emdash
também há algumas coisas que você pode fazer com$PATH
e%func
.Respostas:
Como a documentação do POSIX permite isso como uma extensão, nada impede a implementação desse comportamento.
Uma verificação simples (executada
zsh
):mostram que
bash
,zsh
,yash
,ksh93
(queksh
ligada no meu sistema),pdksh
e sua derivação permitir multi-bytes caracteres como nome da função.yash
foi desenvolvido para suportar caracteres multibyte desde o início, portanto não é surpresa que funcionou.A outra documentação que você pode consultar é
ksh93
:Então, definindo para
C
localidade:faça com que falhe.
fonte
posh
não vale a pena ser listado nessa lista. Depende de erros específicos do Linuxlibc
e não funcionará em outras plataformas.ksh93
uso de um ksh93 auto compilado de fontes originais. Emboraksh88
pareça aceitar letras não ASCII de 7 bits para nomes de funções, apenas oksh93
binário do Ubuntu parece aceitá-las.Observe que as funções compartilham o mesmo espaço de nome que outros comandos, incluindo comandos no sistema de arquivos, que na maioria dos sistemas não têm limitações nos caracteres ou mesmo bytes que podem conter em seu caminho.
Portanto, enquanto a maioria das conchas restringe os caracteres de suas funções, não há uma boa razão para fazer isso. Isso significa que, nesses shells, existem comandos que você não pode substituir por uma função.
zsh
erc
permitir qualquer coisa para seus nomes de função, incluindo alguns com/
e a string vazia.zsh
permite até NUL bytes.Um comando simples no shell é uma lista de argumentos, e o primeiro argumento é usado para derivar o comando a ser executado. Portanto, é lógico que esses argumentos e nomes de funções compartilhem os mesmos valores possíveis e
zsh
argumentos de built-in e funções, pode haver qualquer sequência de bytes.Não há problema de segurança aqui, pois as funções que você (o autor do script) define são as que você chama.
Onde pode haver problemas de segurança é quando a análise é afetada pelo ambiente, por exemplo, com shells em que os nomes válidos para funções são afetados pelo código do idioma.
fonte
function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }
, e potencialmente coisas úteis também com funções nomeadas--
,//
,@
ou%
etc./
é encontrada em um nome? e uma função não é apenas um nome executável - seu código. eu pensaria que uma implementação simples poderia encontrar muitos problemas de análise se os nomes de funções armazenadas incluíssem metacaracteres.