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

18

Vous connaissez probablement cette bombe à fourche :

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

Je me demande pourquoi il est nécessaire, pour l'analyser, d'inclure un espace après l'accolade ouvrante.

Benoit
la source

Réponses:

13

{}

          { list; }

Le fait de placer une liste de commandes entre accolades entraîne l'exécution de la liste dans le contexte shell actuel. Aucun sous-shell n'est créé. La liste suivante, point-virgule (ou nouvelle ligne) est requise.

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 liste par des blancs ou d'autres métacaractères shell. Les parenthèses sont des opérateurs et sont reconnues comme des jetons distincts par le shell même si elles ne sont pas séparées de la liste par des espaces.

// source

se ruer
la source
1
J'ai chicané avec votre réponse dans mon propre post sur cette page. C'est une fonction et non un groupement de commandes.
donothingsuccessly
3
@donothingsuccessfully Un corps de fonction est un groupe de commandes.
Gilles 'SO- arrête d'être méchant'
3

Je pense que @rush peut donner ici une réponse correcte mais trompeuse. La bombe fourchette définit une fonction appelée " :". Le code entre les accolades n'est pas exécuté tant que la fonction n'est pas appelée par le dernier " :". Ainsi, les accolades en tant que groupe de commandes et les accolades en tant que corps de fonction sont syntaxiquement les mêmes mais ont une sémantique différente.
Du même document que cite @rush:

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 blancs ou des nouvelles lignes. 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 liste de commandes par des espaces ou un autre métacaractère shell. En outre, lorsque vous utilisez les accolades, la liste doit être terminée par un point-virgule, un «&» ou une nouvelle ligne.

avec succès
la source
3
Non, la réponse de Rush est correcte. Les accolades autour d'un corps de fonction sont le même élément syntaxique que lorsqu'ils ne sont pas délimités un corps de fonction. Voir les règles de grammaire du shell : a function_bodyest un compound_command(plus un facultatif redirect_list). L'espace est nécessaire car il {s'agit d'un mot réservé et non d'un caractère spécial.
Gilles 'SO- arrête d'être méchant'
Oui, la réponse de Rush est correcte, comme je l'ai dit. Oui, ils sont syntaxiquement les mêmes, comme je l'ai dit. Mais brace_groups se comportent différemment lorsqu'ils font partie d'une fonction et lorsqu'ils ne le sont pas. J'utilisais le groupement de commandes pour décrire ce dernier cas et c'est ce qui a été décrit dans le lien de rush.
donothingsuccess
2
Je ne suis pas sûr que la distinction sémantique soit significative ici, car c'est la syntaxe qui compte pour l'analyseur. La vraie réponse n'est {pas un opérateur mais un mot réservé, et les mots doivent être séparés des autres mots pour être considérés comme distincts.
jw013