bash – diferencia entre "function foo () {}" y "foo () {}"

Pregunta:

Puedo definir funciones bash usando u omitiendo la palabra clave de function . ¿Hay alguna diferencia?

#!/bin/bash

function foo() {
  echo "foo"
}

bar() {
  echo "bar"
}

foo

bar

Ambas llamadas a las funciones foo y bar tienen éxito y no veo ninguna diferencia. Entonces me pregunto si es solo para mejorar la legibilidad, o hay algo que me falta …

Por cierto, en otras shells como dash ( /bin/sh está enlazado simbólicamente a dash en debian / ubuntu) falla cuando se usa la palabra clave de function .

Respuesta:

La palabra clave de function se introdujo en ksh . El shell Bourne tradicional solo tenía la sintaxis foo () , y POSIX estandariza solo la sintaxis foo () .

En ATT ksh (pero no pdksh), existen algunas diferencias entre las funciones definidas por function y las funciones definidas con la sintaxis de Bourne / POSIX. En funciones definidas por function , la palabra clave typeset declara una variable local: una vez que la función sale, el valor de la variable se restablece a lo que era antes de ingresar a la función. Con la sintaxis clásica, las variables tienen un alcance global ya sea que use typeset o no.

$ ksh -c 'a=global; f () { typeset a=local; }; f; echo $a'
local
$ ksh -c 'a=global; function f { typeset a=local; }; f; echo $a'
global

Otra diferencia en ksh es que las funciones definidas con la palabra clave function tienen su propio contexto de trampa. Las trampas definidas fuera de la función se ignoran mientras se ejecuta la función, y los errores fatales dentro de la función salen solo de la función y no de todo el script. Además, $0 es el nombre de la función en una función definida por function pero el nombre del script en una función definida con () .

Pdksh no emula ATT ksh. En pdksh, typeset crea variables de ámbito local independientemente de la función, y no hay trampas locales (aunque el uso de la function hace algunas diferencias menores; consulte la página de manual para obtener más detalles).

Bash y zsh introdujeron la palabra clave de function para compatibilidad con ksh. Sin embargo, en estos shells, las function foo { … } y foo () { … } son estrictamente idénticas, al igual que las function foo () { … } extensión bash y zsh function foo () { … } . La palabra clave typeset siempre declara variables locales (excepto con -g por supuesto), y las trampas no son locales (puede obtener trampas locales en zsh configurando la opción local_traps ).

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım