Existem problemas com hífens em funções, aliases e executáveis?

25

Nos meus testes (no Bash e no Z Shell), não vi problemas com a definição de funções ou aliases ou scripts de shell executáveis ​​com hífens no nome, mas não tenho certeza de que tudo ficará bem em todos os shells e em todos os casos de uso .

A razão pela qual gostaria de fazer isso é que um hífen é mais fácil de digitar do que um sublinhado e, portanto, mais rápido e suave.

Uma razão pela qual hesito em confiar que não é 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 pudesse acontecer em algumas conchas, onde o hífen é interpretado como sinalizando uma opção mesmo sem espaço.

Outro motivo para suspeitar um pouco é que meu editor de texto estraga a sintaxe, destacando funções com hífens. (Mas é claro que é perfeitamente possível que isso seja apenas um bug em sua sintaxe, destacando a configuração dos scripts de shell.)

Existe alguma razão para evitar hífens?

iconoclasta
fonte

Respostas:

32

POSIX e hífens: sem garantia

De acordo com o padrão POSIX, um nome de função deve ser um nome válido e um nome pode consistir em:

3.231 Nome
Na linguagem de comando do shell, uma palavra que consiste apenas em sublinhados, dígitos e alfabéticos do conjunto de caracteres portátil. O primeiro caractere de um nome não é um dígito.

Além disso, um alias deve ser um nome de alias válido , que pode consistir em:

3.10 Nome alternativo
Na linguagem de comando do shell, uma palavra composta apenas por sublinhados, dígitos e alfabéticos do conjunto de caracteres portáteis e qualquer um dos seguintes caracteres: '!', '%', ',', '@'.

As implementações podem permitir outros caracteres nos nomes alternativos como uma extensão. (Ênfase minha.)

Um hífen não está listado entre os caracteres que devem ser permitidos em ambos os casos. Portanto, se eles forem usados, a portabilidade não é garantida.

Exemplos de cascas que não oferecem suporte a hífens

dashé o shell padrão ( /bin/sh) na família debian-ubuntu e não suporta hífens nos nomes das funções:

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

Curiosamente, ele faz hífens apoio em aliases, embora, como mencionado acima, esta é uma característica de implementação , não uma exigência:

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

O shell do busybox (shell Almquist) também não suporta hífens nos nomes das funções:

$ a-b() { date; }
-sh: Syntax error: Bad function name

Resumo do Suporte ao Hífen do Shell

Sabe-se que os seguintes shells suportam hífens nos nomes das funções:

  • ksh, bash, zsh

Sabe- se que os seguintes shells não suportam hífens nos nomes das funções:

  • ash (busybox), csh, tcsh, traço

Conclusões

  • Os hífens não são padrão. Afaste-se deles se desejar compatibilidade entre shell.
  • Use sublinhados em vez de hífens: os sublinhados são aceitos em todos os lugares.
John1024
fonte
2
Os nomes -neles são maus. Eu estou olhando para você, CSS. :)
PM 2Ring
Obrigado. Eu testei no final cshe tcshe eles não suportam hífens também, mas Korn shell fez. É um pouco engraçado que eu usei a-b()como meu nome de função também.
Iconoclast
@iconoclast Adicionei os resultados dos seus testes de shell à resposta. Obrigado.
John1024
@ PM2Ring são mais fáceis de digitar do que nomes com sublinhados. Excluindo a tradição ou decisões de implementação de sistemas que não os permitem, que princípio você pode apontar para apoiar a alegação de que eles são maus?
Iconoclast
11
@iconoclast Os nomes com hífens são impossíveis em muitos idiomas, pois o hífen é interpretado como um sinal de menos. Portanto, se esse idioma precisar interoperar com um idioma que suporte nomes com hífens, você terá a situação confusa em que entidades com nomes hifenizados são forçadas a tem um nome diferente no outro idioma.
usar o seguinte comando
3

Sei que é muito tarde, mas talvez você possa solucionar o problema de tornar o sublinhado mais acessível.

xmodmap -e "keycode  20 =  underscore minus"

Isso alternará o sublinhado com hífen (menos).

Então, agora, você mantém pressionado shift por hífen, mas um sublinhado é digitado sem shift.

Seu código de chave pode ser diferente, no entanto, acho que depende do seu teclado; o meu passa a ser 20. Entre em contato se precisar de ajuda para encontrar o código de chave que você precisa usar.

TuxForLife
fonte