Sans le ()
, la syntaxe serait vraiment ambiguë.
Il doit y avoir une syntaxe sans ambiguïté pour définir une fonction, et sans modifier substantiellement l' autre syntaxe du shell, cela ne peut pas être ceci:
do_something {
# one or more commands go here
}
Vous avez dit que cela "ne se confond pas avec sa syntaxe actuelle", mais c'est le cas! Notez que vous n'obtenez aucune sorte d'erreur de syntaxe lorsque vous essayez d'exécuter la première ligne de cela . Vous obtenez une erreur, mais ce n'est pas une erreur de syntaxe. La deuxième ligne, avec }
, est une erreur de syntaxe, mais pas la première ligne. Au lieu de cela, do_something {
tente d'exécuter une commande appelée do_something
et de passer {
comme argument à cette commande:
$ do_something {
do_something: command not found
S'il existe déjà une commande appelée do_something
, vous l'exécutez. S'il existe déjà une fonction appelée do_something
, vous l'appelez . Il est important en général que la syntaxe soit sans ambiguïté, mais il est également important spécifiquement qu'il soit possible de redéfinir une fonction sans l'appeler accidentellement à la place. Définir une fonction et l'appeler ne doit pas se ressembler.
Comment la coquille traite {
et (
.
Comme type {
vous le direz, {
est un mot clé shell. Cela fait comme [[
. S'il est utilisé dans une situation où il s'agirait autrement d'une commande, il {
porte une sémantique spéciale. Plus précisément, il effectue un regroupement de commandes. Dans d'autres situations, cependant, il peut être utilisé sans échappatoire pour désigner un {
caractère littéral . Cela inclut la situation de le passer comme un deuxième mot ou un mot suivant d'une commande.
Bien sûr, Bash aurait pu être conçu pour traiter {
différemment de ce qu'il fait actuellement. Cependant, sa syntaxe n'aurait alors plus été compatible avec le shell POSIX, et Bash ne serait pas vraiment un shell de style Bourne et ne serait pas capable d'exécuter de nombreux scripts shell.
En revanche, (
est un métacaractère shell. Il est toujours traité spécialement si elle apparaît dans une commande et ne sont pas cotés (avec '
'
, "
"
ou \
). Il n'y a donc aucune ambiguïté dans la syntaxe:
do_something() {
# one or more commands go here
}
Cela ne pouvait pas signifier autre chose. Si Bash n'avait pas de fonctions, ce serait une erreur de syntaxe, pour la même raison echo foo(bar)
c'est une erreur de syntaxe.
Si vous n'aimez pas vraiment la ()
notation, vous pouvez utiliser le mot-clé function
et l'omettre, comme le mentionne sudodus . Notez que cela ne fait pas partie de la syntaxe de définition des fonctions dans la plupart des autres shells de style Bourne - et dans certains cas, il est pris en charge mais les fonctions définies de cette façon ont une sémantique différente - et donc un script qui l'utilise ne sera pas portable. (La raison pour laquelle cette syntaxe peut être sans ambiguïté est qu'elle function
est elle-même un mot clé dans Bash qui signifie que tout ce qui suit est le début d'une définition de fonction.)
Enfin, notez que bien que la plupart des définitions de fonctions utilisent {
en pratique, toute commande composée est autorisée. Si vous aviez une fonction dont vous vouliez toujours exécuter le corps en sous-shell, vous pourriez utiliser (
)
plutôt que {
}
.