2011-10-27 11 views

Respuesta

48

La palabra clave function es opcional cuando se define una función en Bash, tal como se documenta en el manual:

funciones se declaran usando la siguiente sintaxis:

name() compound-command [ redirections ]

o

function name [()] compound-command [ redirections ]

Generalmente, se prefiere la primera forma de sintaxis porque es compatible con los scripts de Bourne/Korn/POSIX y, por lo tanto, es más portátil.
Dicho esto, a veces es posible que desee utilizar la palabra clave function para evitar que Bash aliases colisione con el nombre de su función. Considere este ejemplo:

$ alias foo="echo hi" 
$ foo() { :; } 
bash: syntax error near unexpected token `(' 

Aquí, 'foo' se sustituye por el texto del alias del mismo nombre, porque es la primera palabra del comando. Con function el alias no se expande:

$ function foo() { :; } 
+3

¿Es esta palabra clave * NON * -POSIX? – gavenkoa

+7

@gavenkoa [Sí] (http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29). Cuando se utiliza la palabra clave 'función', las declaraciones de la función Bash no son compatibles con los scripts de Bourne/Korn/POSIX. –

+0

Tenga en cuenta que en el shell Korn hay diferencias en el alcance de las variables 'typedef''ed entre las dos formas de declarar funciones (dado que las variables delimitadas no son POSIX). – cdarke

4

La palabra reservada function es opcional. Consulte la sección 'Definiciones de funciones de shell' en el bash man page.

+0

¿Es esta palabra clave * NO * - POSIX? – gavenkoa

+1

@gavenkoa Sí lo es. – tripleee

50

La palabra clave function es necesario en casos excepcionales cuando el nombre de la función es también un alias. Sin ella, Bash expande el alias antes de analizar la definición de función - probablemente no lo que quiere:

alias mycd=cd 
mycd() { cd; ls; } # Alias expansion turns this into cd() { cd; ls; } 
mycd    # Fails. bash: mycd: command not found 
cd     # Uh oh, infinite recursion. 

Con la palabra clave function, las cosas funcionan como se esperaba:

alias mycd=cd 
function mycd() { cd; ls; } # Defines a function named mycd, as expected. 
cd       # OK, goes to $HOME. 
mycd       # OK, goes to $HOME. 
\mycd      # OK, goes to $HOME, lists directory contents. 
Cuestiones relacionadas