Définition de la fonction Shell: pourquoi y a-t-il un espace après l'accolade d'ouverture?

Vous connaissez probablement cette bombe à fourche :

:(){ :|:&};: #WARNING: harmful code 

Je me request pourquoi il est nécessaire, pour qu'il parsing, d'inclure un espace après l'accolade d'ouverture.

{}

  { list; } 

Si vous placez une list de commands entre accolades, la list sera exécutée dans le context actuel de l'interpréteur de commands. Aucun sous-shell n'est créé. La list suivante de point-virgule (ou de nouvelle ligne) est requirejse.

En plus de la création d'un sous-shell, il existe une différence subtile entre ces deux constructions pour des raisons historiques. Les accolades sont des mots réservés, ils doivent donc être séparés de la list par des blancs ou d'autres métacaractères. Les parenthèses sont des opérateurs et sont reconnues comme des jetons distincts par le shell même s'ils ne sont pas séparés de la list par des espaces.

// source

Je pense que @rush peut donner une réponse correcte si trompeuse ici. La fourche-bombe définit une fonction appelée " : ". Le code dans les accolades n'est pas exécuté jusqu'à ce que la fonction soit appelée par la finale " : ". Ainsi, les accolades en tant que groupe de commands et les accolades en tant que corps fonctionnel sont syntaxiquement les mêmes mais ont une sémantique différente.
D'après le même document que @rush cite:

Notez que pour des raisons historiques, dans l'utilisation la plus courante, les accolades qui entourent le corps de la fonction doivent être séparées du corps par des espaces ou des returns à la ligne. En effet, les accolades sont des mots réservés et ne sont reconnus comme tels que lorsqu'ils sont séparés de la list de commands par des espaces ou un autre métacaractère. En outre, lors de l'utilisation des accolades, la list doit être terminée par un point-virgule, un '&' ou une nouvelle ligne.