
Em meus testes (em Bash e Z Shell), não vi problemas com a definição de funções ou aliases ou scripts de shell executáveis que possuem hífens no nome, mas não tenho certeza de que isso funcionará em todos os shells e em todos os casos de uso .
A razão pela qual eu gostaria de fazer isso é que um hífen é mais fácil de digitar do que um sublinhado e, portanto, mais rápido e suave.
Um motivo pelo qual hesito em confiar que isso não seja um problema é que em alguns idiomas (Ruby, por exemplo) o hífen seria interpretado como um sinal de menos, mesmo sem espaços ao seu redor. Não me surpreenderia se algo assim acontecesse em alguns shells, onde o hífen é interpretado como sinalizando uma opção mesmo sem espaço.
Outra razão pela qual estou um pouco desconfiado é que meu editor de texto bagunça o destaque de sintaxe para funções com hífens. (Mas é claro que é perfeitamente possível que isso seja apenas um bug em sua sintaxe, destacando a configuração para scripts de shell.)
Existe alguma razão para evitar hífens?
Responder1
POSIX e hífens: sem garantia
De acordo com o padrão POSIX,um nome de funçãodeve ser um nome válido eum nomepode consistir em:
3.231 Nome
Na linguagem de comando shell, uma palavra que consiste apenas em sublinhados, dígitos e caracteres alfabéticos do conjunto de caracteres portáteis. O primeiro caractere de um nome não é um dígito.
Adicionalmente,um apelidodeve ser válidonome alternativo, que pode consistir em:
3.10 Nome alternativo
Na linguagem de comando shell, uma palavra que consiste apenas em sublinhados, dígitos e caracteres alfabéticos do conjunto de caracteres portáteis e qualquer um dos seguintes caracteres: '!', '%', ',', '@'.As implementações podem permitir outros caracteres em nomes alternativos como uma extensão. (Ênfase minha.)
Um hífen énãolistado entre os caracteres que devem ser permitidos em ambos os casos. Portanto, caso sejam utilizados, a portabilidade não é garantida.
Exemplos de shells que não suportam hífens
dash
é o shell padrão ( /bin/sh
) na família debian-ubuntu e não suporta hífens em nomes de funções:
$ a-b() { date; }
dash: 1: Syntax error: Bad function name
Curiosamente, éfazsuporta hífens em aliases, embora, como observado acima, este seja umcaracterística de implementação, não é um requisito:
$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world
O shell busybox (apenas o baseado em ash) também não suporta hífens em nomes de funções:
$ a-b() { date; }
-sh: Syntax error: Bad function name
Resumo do suporte a hífen da Shell
Os seguintes shells são conhecidos por suportar hífens em nomes de funções:
- pdksh e derivados, bash, zsh
- alguns derivados do Ash, como o sh do FreeBSD (desde 2010) ou NetBSD (desde 2016.
- busybox sh quando o shell selecionado em tempo de compilação é
hush
em vez deash
. - csh e tcsh (em seus apelidos, esses shells não têm suporte a funções). De qualquer forma, esses shells têm uma sintaxe radicalmente diferente, então não há esperança de ter compatibilidade entre shells com eles.
- rc e derivados (novamente com uma sintaxe radicalmente diferente)
- fish (novamente com uma sintaxe radicalmente diferente)
Os seguintes shells são conhecidosnãopara suportar hífens em nomes de funções:
- o shell Bourne e derivados como ksh88 e bosh (no shell Bourne, funções e variáveis compartilhavam o mesmo namespace, você não poderia ter uma variável e uma função com o mesmo nome).
- ksh93, yash, o ash original e alguns de seus derivados (busybox ash (a escolha padrão para sh), dash)
Conclusões
- Os hífens não são padrão. Fique longe deles se quiser compatibilidade entre shells.
- Use sublinhados em vez de hífens: sublinhados são aceitos em todos os lugares.
Responder2
Eu sei que é muito tarde, mas talvez você possa contornar o problema de tornar o sublinhado mais acessível.
xmodmap -e "keycode 20 = underscore minus"
Isso mudará o sublinhado por hífen (menos).
Então agora você mantém shift para hífen, mas um sublinhado é digitado sem shift.
Seu código-chave pode ser diferente, porém, acho que depende do seu teclado; o meu é 20. Avise-me se precisar de ajuda para encontrar o código-chave que precisa usar.