
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, más rápido y fluido.
Una razón por la que dudo en confiar en que no sea un problema es que en algunos idiomas (Ruby, por ejemplo) el guión se interpretaría como un signo menos incluso sin espacios alrededor. No me sorprendería que algo como esto pudiera suceder en algunos shells, donde el guión se interpreta como una opción incluso sin un 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 muy posible que sea solo un error en la configuración de resaltado de sintaxis para los scripts de shell).
¿Hay alguna razón para evitar los guiones?
Respuesta1
POSIX y guiones: sin garantía
Según el estándar POSIX,un nombre de funcióndebe ser un nombre válido yun nombrepuede consistir en:
3.231 Nombre
En el lenguaje de comandos del shell, palabra que consta únicamente de guiones bajos, dígitos y letras del conjunto de caracteres portátiles. El primer carácter de un nombre no es un dígito.
Además,un aliasdebe ser un válidoApodo, que puede consistir en:
3.10 Nombre de alias
En el lenguaje de comandos del shell, una palabra que consta únicamente de guiones bajos, dígitos y letras del conjunto de caracteres portátiles y cualquiera de los siguientes caracteres: '!', '%', ',', '@'.Las implementaciones pueden permitir otros caracteres dentro de los nombres de alias como extensión. (El énfasis es mío).
Un guión esnoenumerados entre los caracteres que deben permitirse en cualquier caso. Por lo que, si se utilizan, no se garantiza la portabilidad.
Ejemplos de shells que no admiten guiones
dash
es 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,haceadmite guiones en los alias; sin embargo, como se señaló anteriormente, esta es unacaracterística de implementación, no es un requisito:
$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world
El shell de Busybox (solo el basado en ash) tampoco admite guiones en los nombres de funciones:
$ a-b() { date; }
-sh: Syntax error: Bad function name
Resumen de compatibilidad con guiones de Shell
Se sabe que los siguientes shells admiten guiones en los nombres de funciones:
- pdksh y derivados, bash, zsh
- algunos derivados de ash como el sh de FreeBSD (desde 2010) o NetBSD (desde 2016.
- Busybox sh cuando el shell seleccionado en el momento de la compilación es
hush
en lugar deash
. - csh y tcsh (en sus alias, esos shells no tienen soporte de funciones). De todos modos, esos shells tienen una sintaxis radicalmente diferente, por lo que no hay esperanza de tener compatibilidad entre shells con ellos.
- rc y derivados (de nuevo con una sintaxis radicalmente diferente)
- pescado (de nuevo con una sintaxis radicalmente diferente)
Se conocen las siguientes conchas.nopara admitir guiones en los nombres de funciones:
- el shell Bourne y derivados como ksh88 y bosh (en el shell Bourne, las funciones y variables compartían el mismo espacio de nombres, no se podía tener una variable y una función con el mismo nombre).
- ksh93, yash, el ash original y algunos de sus derivados (ash busybox (la opción predeterminada para sh), guión)
Conclusiones
- Los guiones no son estándar. Manténgase alejado de ellos si desea compatibilidad entre shells.
- Utilice guiones bajos en lugar de guiones: los guiones bajos se aceptan en todas partes.
Respuesta2
Sé que esto es muy 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 un guión (menos).
Entonces, ahora mantiene presionada la tecla Mayús para el guión, pero se escribe un guión bajo sin mayúsculas.
Su código clave puede ser diferente, sin embargo, creo que depende de su teclado; el mío es 20. Avíseme si necesita ayuda para encontrar qué código clave necesita usar.