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.
la source
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.
{}
{ 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
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:
la source
function_body
est uncompound_command
(plus un facultatifredirect_list
). L'espace est nécessaire car il{
s'agit d'un mot réservé et non d'un caractère spécial.brace_group
s 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.{
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.