Sin el ()
, la sintaxis sería realmente ambigua.
Tiene que haber una sintaxis inequívoca para definir una función, y sin alterar sustancialmente otra sintaxis de shell, no puede ser esto:
do_something {
# one or more commands go here
}
Dijiste que esto "no entra en conflicto con su sintaxis actual", ¡pero lo hace! Tenga en cuenta que no obtiene ningún tipo de error de sintaxis cuando intenta ejecutar la primera línea de ese . Obtiene un error, pero no es un error sobre la sintaxis. La segunda línea, con }
, es un error de sintaxis, pero la primera línea no lo es. En su lugar, do_something {
intenta ejecutar un comando llamado do_something
y pasar {
como argumento a ese comando:
$ do_something {
do_something: command not found
Si ya hay un comando llamado do_something
, lo está ejecutando. Si ya hay una función llamada do_something
, la está llamando . Es importante en general que la sintaxis no sea ambigua, pero también es importante específicamente que sea posible redefinir una función sin llamarla accidentalmente. Definir una función y llamarla no debería verse igual.
Cómo se trata la concha {
y (
.
Como type {
te diré, {
es una palabra clave de shell. Esto lo hace como [[
. Si se usa en una situación en la que de otra manera sería un comando, {
lleva una semántica especial. Específicamente, realiza la agrupación de comandos. En otras situaciones, sin embargo, puede usarse sin escape para denotar un {
carácter literal . Esto incluye la situación de pasarlo como una segunda palabra o una palabra posterior de un comando.
Por supuesto, Bash podría haber sido diseñado para tratar de manera {
diferente de lo que lo hace actualmente. Sin embargo, su sintaxis ya no habría sido compatible con el shell POSIX, y Bash realmente no sería un shell de estilo Bourne y no sería capaz de ejecutar muchos scripts de shell.
En contraste, (
es un metacarácter de concha. Siempre se trata de forma especial si aparece en una orden y no se cita (con '
'
, "
"
o \
). Por lo tanto, no hay ambigüedad en la sintaxis:
do_something() {
# one or more commands go here
}
Eso no podría significar nada más. Si Bash no tuviera funciones, entonces sería un error de sintaxis, por la misma razón echo foo(bar)
es un error de sintaxis.
Si realmente no le gusta la ()
notación, puede usar la palabra clave function
y omitirla, como menciona sudodus . Tenga en cuenta que esto no es parte de la sintaxis para definir funciones en la mayoría de los otros shells de estilo Bourne, y en algunos, es compatible, pero las funciones definidas de esa manera tienen una semántica diferente, por lo que un script que lo use no será portátil. (La razón por la cual esta sintaxis es inequívoca es que function
es una palabra clave en Bash que significa que lo que sigue es el comienzo de una definición de función).
Finalmente, tenga en cuenta que, si bien la mayoría de las definiciones de funciones se usan {
en la práctica, se permite cualquier comando compuesto. Si tuvieras una función cuyo cuerpo siempre quisieras ejecutar en una subshell, podrías usar en (
)
lugar de {
}
.