Una función se define como:
do_something () {
do it
}
Podía entender su nombre 'do_something' y el paréntesis para encapsular el código de acciones, pero no puedo entender cuál es el propósito ()
aquí, ya que no hay parámetros con nombre en los scripts de Bash. Puede ser mejor y sencillo definirlo como
do_something {
do it
}
Lo que no entra en conflicto con su sintaxis actual, y aún más declara que no hay parámetros con nombre. ¿De qué sirve ()
aquí?
Respuestas:
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:
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 llamadodo_something
y pasar{
como argumento a ese comando:Si ya hay un comando llamado
do_something
, lo está ejecutando. Si ya hay una función llamadado_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: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 clavefunction
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 quefunction
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{
}
.fuente
El
()
token es decirle al intérprete de shell que estás declarando una función.Una alternativa en
bash
esfunction
o como una sola línea puedes probar
fuente
function
palabra clave es un ksh-ism anterior a POSIX que bash admite para la compatibilidad con versiones anteriores; sin embargo, bash lo soporta mal (no hace que las variables sean locales por defecto, como lo hizo ksh en funciones declaradas en esa forma). En consecuencia, no es ideal para un nuevo código. Ver wiki.bash-hackers.org/scripting/obsoletetypeset
sin-g
en una función siempre declara una variable local. Con lasfunction
variables de alcance de palabra clave, bash y ksh de la misma manera , ¿no es así?¡Qué estilo tan único de ti!
Considere otros estilos de llaves perfectamente finas:
¿Cómo puede saber el shell que esas son definiciones de funciones y no simplemente un comando
foo
seguido de listas de comandos? En todos estos casos, es necesario un factor de desambiguación adicional, como()
o lafunction
palabra clave.fuente
()
o algo así.