Je peux définir des bash
fonctions en utilisant ou en omettant le function
mot clé. Y a-t-il une différence?
#!/bin/bash
function foo() {
echo "foo"
}
bar() {
echo "bar"
}
foo
bar
Les deux appels aux fonctions foo
et bar
réussissent et je ne vois aucune différence. Alors je me demande si c'est juste pour améliorer la lisibilité, ou s'il y a quelque chose qui me manque ...
BTW dans les autres shells comme dash
( /bin/sh
est lié à un lien symbolique dash
dans debian / ubuntu), il échoue lors de l’utilisation du function
mot clé.
function baz { echo "baz"; }
. Voir Bashism dans le wiki de GreyCat.Réponses:
Autant que je sache, à part le fait que la deuxième version est plus portable.
la source
tar cf - /some/thing | ssh user@desthost "cd destinationdir && tar xf - "
prévenir sans vérifier au préalable de vérifier si la version de tar sur desthost se débarrassera du "/" pourrait conduire à catastrophes dans certains cas ...). Par exemple, si on l'utilisefunction tar { #a safe tar with safety checks ... }
et qu'on l'sh
ignore, ...sh
lefunction
mot-clé - et, en général, qui supposent des fonctionnalités communes mais non standard qui ressemblent à une coquilleksh
etbash
offrent - ne fonctionneront souvent pas sur les systèmes de production les plus récents , même s'ils fonctionnaient sur des versions plus anciennes de le même OS.bash
fournit encoresh
sur de nombreux systèmes GNU / Linux, mais certaines distributions populaires ont opté poursh
un lien symbolique versdash
(la Debian Almquist SHell) afin d’améliorer les performances. Cela inclut Debian et Ubuntu .Le
function
mot clé a été introduit en ksh . Le shell Bourne traditionnel n’avait que lafoo ()
syntaxe et POSIX ne standardise que lafoo ()
syntaxe.Dans ATT ksh (mais pas pdksh), il existe quelques différences entre les fonctions définies par
function
et les fonctions définies avec la syntaxe Bourne / POSIX. Dans les fonctions définies parfunction
, letypeset
mot - clé déclare une variable locale: une fois la fonction fermée, la valeur de la variable est réinitialisée à ce qu'elle était avant d'entrer dans la fonction. Avec la syntaxe classique, les variables ont une portée globale, que vous utilisieztypeset
ou non.Une autre différence dans ksh est que les fonctions définies avec le
function
mot clé ont leur propre contexte d'interruption. Les interruptions définies en dehors de la fonction sont ignorées lors de l'exécution de la fonction et les erreurs fatales à l'intérieur de la fonction sortent uniquement de la fonction et non du script entier. Aussi,$0
est le nom de la fonction dans une fonction définie parfunction
mais le nom du script dans une fonction définie avec()
.Pdksh n'émule pas ATT ksh. Dans pdksh,
typeset
crée des variables de portée locale, quelle que soit la fonction, et il n'y a pas de pièges locaux (bien que l'utilisationfunction
apporte quelques différences mineures - voir la page de manuel pour plus de détails).Bash et zsh ont introduit le
function
mot - clé pour la compatibilité avec ksh. Cependant, dans ces shellsfunction foo { … }
etfoo () { … }
sont strictement identiques, de même que les extensions bash et zshfunction foo () { … }
. Letypeset
mot clé déclare toujours les variables locales (sauf avec-g
bien sûr), et les traps ne sont pas locaux (vous pouvez obtenir des traps locaux dans zsh en définissant l'local_traps
option).la source
foo() command
syntaxe et que celle-ci a ensuite été ajoutée au shell Korn pour des raisons de compatibilité.function { ... }; f;
omettref
après lefunction
mot clé?est la syntaxe Bourne supportée par tout shell de type Bourne mais
bash
,yash
et les versions récentes deposh
(qui ne supportent que les commandes composées). (Les implémentations de Bourne Shell et d’AT & Tksh
ne prennent pas en chargefoo() any-command > redirections
sauf s’ilany-command
s’agit d’une commande composée).(exemples de commandes composé:
{ cmd; }
,for i do echo "$i"; done
,(cmd)
... l'être le plus couramment utilisé{ ...; }
)est la syntaxe POSIX prise en charge par tout shell de type Bourne et celui que vous souhaitez généralement utiliser.
est la syntaxe du shell Korn, antérieure à la syntaxe Bourne. Utilisez uniquement celui-ci si vous écrivez spécifiquement pour la mise en œuvre de la coque Korn chez AT & T et si vous avez besoin du traitement spécifique qui y est appliqué. Cette syntaxe n'est pas POSIX, mais est pris en charge par
bash
,yash
etzsh
pour la compatibilité avec le shell Korn si ces coquilles (et lespdksh
variantes à base de Korn shell) ne traite pas différent de la syntaxe standard.est la syntaxe de no shell et ne doit pas être utilisé . Il arrive que d'être pris en charge par accident par
bash
,yash
,zsh
et lespdksh
variantes à base de Korn shell. Incidemment, c'est aussi laawk
syntaxe de la fonction.Si nous continuons à descendre la liste ésotérique,
(comme
function foo() (subshell)
oufunction foo() for i do; ... done
) est encore pire. Il est supporté parbash
,yash
etzsh
non pas ksh, même lespdksh
variantes basées sur.Tandis que:
est uniquement supporté par
zsh
.la source
function
mot clé et les parenthèses est documentée dans Bash. Le manuel de Bash 4.2 et versions ultérieures indique que les fonctions sont déclarées par la syntaxename () compound-command [ redirections ]
oufunction name [()] compound-command [ redirections ]
. Dans Bash 4.1.11, au moins la version 3.0-bêta était une simple ligne[ function ] name () compound-command [redirection]
qui ne couvrait pas, par erreur, la syntaxe incluant lefunction
mot clé, mais pas les parenthèses, mais couvrant néanmoins la syntaxe comprenant lefunction
mot clé et les parenthèses.bash
reconnaît ,function foo {
en plus defoo() {
la compatibilité avec le shell Korn (et a toujours) de sorte qu'il peut interpréter des scripts écrits pour le shell Korn. Il prend également en chargefunction foo () {
, mais il n'y a aucune bonne raison de l'utiliser.function f() {
. En termes de lisibilité, cette fonction sera reconnue par tous ceux qui connaissent l'anglais et ceux qui connaissent le C, par opposition à un seul de ces ensembles.You should never combine the keyword function with the parentheses () when defining a function.
Sémantiquement, ces deux formes sont équivalentes dans Bash.
De la page de manuel:
EDIT: Je viens de remarquer que cette question est étiquetée
posix
. Dans POSIXsh
, lefunction
mot-clé n'est pas utilisé (bien qu'il soit réservé).la source
Plusieurs autres ont déjà répondu correctement, mais voici mon résumé concis:
La deuxième version est portable et est susceptible de fonctionner avec de nombreux shells standard (en particulier POSIX).
La première version fonctionnera uniquement avec bash, mais vous pouvez omettre les parenthèses après le nom de la fonction.
Sinon, ils représentent des entités identiques après leur interprétation par bash.
la source
()
et lefunction
mot - clé, le shell se comporte comme si vousfoo(){ ...; }
veniez de le faire, sauf, bien sûr, pour un shell dans lequel la syntaxe n'est pas valide. et donc vous devriez le fairefunction foo { ...; }
si vous devez, oufoo(){ ...; }
autrement.