¿Hay problemas con guiones en funciones, alias y ejecutables?

25

En mis pruebas (en Bash y Z Shell), no vi problemas con la definición de funciones o alias o scripts de shell ejecutables que tienen guiones en el nombre, pero no estoy seguro de que esto esté bien en todos los shells y en todos los casos de uso .

La razón por la que me gustaría hacer esto es que un guión es más fácil de escribir que un guión bajo y, por lo tanto, es más rápido y suave.

Una razón por la que dudo en confiar en que no es un problema es que en algunos idiomas (Ruby, por ejemplo), el guión se interpretaría como un signo menos, incluso sin espacios a su alrededor. No me sorprendería si algo así pudiera suceder en algunos shells, donde el guión se interpreta como una opción, incluso sin espacio.

Otra razón por la que sospecho un poco es que mi editor de texto arruina el resaltado de sintaxis para funciones con guiones. (Pero, por supuesto, es completamente posible que eso sea solo un error en su configuración de resaltado de sintaxis para scripts de shell).

¿Hay alguna razón para evitar guiones?

iconoclasta
fuente

Respuestas:

32

POSIX y guiones: sin garantía

Según el estándar POSIX, el nombre de una función debe ser un nombre válido y un nombre puede consistir en:

3.231 Nombre
En el lenguaje de comando de shell, una palabra que consiste únicamente en guiones bajos, dígitos y alfabéticos del juego de caracteres portátil. El primer carácter de un nombre no es un dígito.

Además, un alias debe ser un nombre de alias válido , que puede consistir en:

3.10 Nombre de alias
En el lenguaje de comando de shell, una palabra que consiste únicamente en guiones bajos, dígitos y alfabéticos del juego de caracteres portátil y cualquiera de los siguientes caracteres: '!', '%', ',', '@'.

Las implementaciones pueden permitir otros caracteres dentro de los nombres de alias como una extensión. (El énfasis es mío).

No se incluye un guión entre los caracteres que se deben permitir en cualquier caso. Entonces, si se usan, la portabilidad no está garantizada.

Ejemplos de conchas que no admiten guiones

dashes el shell predeterminado ( /bin/sh) en la familia debian-ubuntu y no admite guiones en los nombres de funciones:

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

Curiosamente, hace guiones de apoyo en los alias, sin embargo, como se señaló anteriormente, esta es una característica de la aplicación , no es un requisito:

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

El shell busybox (shell Almquist) tampoco admite guiones en los nombres de funciones:

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

Resumen del soporte de guiones de Shell

Se sabe que los siguientes shells admiten guiones en los nombres de funciones:

  • ksh, bash, zsh

Se sabe que los siguientes shells no admiten guiones en los nombres de funciones:

  • ash (busybox), csh, tcsh, guión

Conclusiones

  • Los guiones no son estándar. Manténgase alejado de ellos si desea compatibilidad cruzada.
  • Utilice guiones bajos en lugar de guiones: los guiones bajos se aceptan en todas partes.
John1024
fuente
2
Los nombres con -ellos son malvados. Te estoy mirando, CSS. :)
PM 2Ring
Gracias. Probé más tarde cshy tcshtampoco admiten guiones, pero Korn shell sí. Es un poco divertido que yo también usara a-b()mi nombre de función.
iconoclasta
@iconoclast Agregué los resultados de sus pruebas de shell a la respuesta. Gracias.
John1024
@ PM2Ring son más fáciles de escribir que los nombres con guiones bajos. Excluyendo la tradición o las decisiones de implementación de los sistemas que no las permiten, ¿qué principio puede señalar para respaldar la afirmación de que son malvadas?
iconoclasta
1
@iconoclantes Los nombres con guiones son imposibles en muchos idiomas, ya que el guión se interpreta como un signo menos, por lo que si dicho idioma necesita interoperar con un idioma que admita nombres con guiones, se obtiene la situación desordenada en la que las entidades con nombres con guiones se ven obligados a tener un nombre diferente en el otro idioma.
PM 2 Timbre
3

Sé que esto es realmente tarde, pero tal vez puedas solucionar el problema de hacer que el guión bajo sea más accesible.

xmodmap -e "keycode  20 =  underscore minus"

Esto cambiará el guión bajo con guión (menos).

Así que ahora, mantienes presionado shift para guión, pero se escribe un guión bajo sin shift.

Su código clave puede ser diferente, sin embargo, creo que depende de su teclado; el mío es 20. Solo avíseme si necesita ayuda para encontrar el código clave que necesita usar.

TuxForLife
fuente