Considera lo siguiente:
$ ksh -c '1(){ echo hi;};1'
ksh: 1: invalid function name
$ dash -c '1(){ echo hi;};1'
dash: 1: Syntax error: Bad function name
$ bash -c '1(){ echo hi;};1'
bash: `1': not a valid identifier
bash: 1: command not found
$ mksh -c '1(){ echo hi;};1'
hi
Básicamente, estaba tratando de declarar funciones 1
y 0
cuáles serían shorthands para true
y false
, pero como puede ver, tuve problemas con el uso de nombres numéricos en las funciones. El mismo comportamiento ocurre con alias y nombres de dos dígitos.
La pregunta es "¿por qué"? ¿Es obligatorio por POSIX? o simplemente un capricho de conchas de bourne?
Ver también la pregunta relacionada con este.
command-line
bash
dash-shell
ksh
Sergiy Kolodyazhnyy
fuente
fuente
0
estátrue
en la secuencia de comandos de shell y1
esfalse
(realmente, cualquier no distinto de cero se trata como falso), en caso de que alguien que lea esto no lo sepa. Esto es al revés de la mayoría de los otros lenguajes de programación.true
en shell. Sin embargo, en la expansión aritmética, los$((...))
estados de retorno se cambian: 1 estrue
y 0 esfalse
para mantener la coherencia con la sintaxis del lenguaje C. Intente, por ejemplo,bash -c 'echo $((1==1));echo $((1==2))'
lo que estaba tratando de hacer fuera de esta pregunta era en realidad "revertir" el comportamiento. Vea el último ejemplo de mi respuesta aquí para ver exactamente qué estaba tratando de hacer. Idea tonta, pero no obstante funcionaRespuestas:
POSIX dice:
Y:
Por lo tanto, una palabra que comienza con un dígito no puede ser un nombre de función.
fuente
1L
significaría? ¿Un nombre de función? O unlong int
literal?()
, posiblemente con argumentos dentro, que denota una llamada a la función en cuestión (y toma el valor que devuelve la función que se llama). Entonces, si tiene una funciónint f() { return 42; }
en C,f
es válida en un contexto de puntero yf()
es válida en un contexto entero sin puntero.Ese es un estándar en muchos idiomas para evitar la confusión entre operaciones matemáticas y variables o funciones o métodos.
Considerar:
Como puede ver, si se permitieran los números como nombres de variables o funciones, hacer cálculos matemáticos más adelante en un programa podría volverse muy confuso y tendría que encontrar soluciones creativas si necesitara hacer cálculos matemáticos con esos números más adelante. También puede producir resultados inesperados en algunos idiomas. Imagine que está incrementando un número para un bucle pero uno de los dígitos ya es una variable que equivale a una cadena. Inmediatamente arrojaría un error. Si no fue el autor original del código, ese error podría tardar bastante en encontrarlo.
En pocas palabras, esta es la razón por la cual la mayoría de los idiomas no le permiten usar un número como el nombre de una variable o función o método, etc.
fuente
$
para expandirse", pero de nuevo, si shell está inspirado en otros lenguajes, está bien, supongo, además, en expansión aritmética((
, no se requiere que las variables tengan encabezado$
. OK, puedo entender eso$
, así que eso es todo. Pero eso es probablemente secundario a la otra razón de "simplemente seguir una convención común"0
el nombre o secuencia de comandos shell,1
,2
, ..., para los parámetros de posición,*
para ellos se unieron,-
para las opciones habilitadas,?
para el último estado de salida, y!
para la PID del trabajo asincrónico más reciente. (Por lo tanto, incluso en$((
))
, a$
menudo se necesita). El código que se muestra aquí para demostrar la razón sugerida no es un script para ningún shell de estilo Bourne, ya que no hay forma de demostrarlo de esa manera, ya que no se aplica a ellos.En C, considere una expresión como:
¿Es
1000l
una variable o una constante? Debido a que los nombres de las variables no pueden comenzar con un dígito, tiene que ser una constante. Esto hace que el análisis sea más fácil y estricto (los errores tipográficos1000k
se pueden detectar fácilmente). También es más fácil tener una sola regla para variables y nombres de funciones, ya que las funciones también pueden tratarse como variables. Ahora, por supuesto, los analizadores son mucho más complejos y potentes, y tenemos cosas como literales personalizados en C ++. Pero en aquellos viejos tiempos de la prehistoria, sacrificar un poco de flexibilidad innecesaria podría hacer que su compilación (o interpretación) sea mucho más corta (y la gente aún se queja de los tiempos de compilación de C ++).Y puede ver los efectos de una influencia de C en todo el lenguaje de shell, por lo que no es sorprendente que el shell Bourne (o C shell) y, por lo tanto, POSIX, hayan restringido la clase de nombres permitidos a la misma que C.
fuente
&&
y||
la falta de soporte para el nulo ASCII en cadenas,