Probabilmente conosci quella bomba a forcella :
:(){ :|:&};: #WARNING: harmful code
Mi chiedo perché sia necessario, per poter analizzare, includere uno spazio dopo l'apertura parentesi graffa.
Probabilmente conosci quella bomba a forcella :
:(){ :|:&};: #WARNING: harmful code
Mi chiedo perché sia necessario, per poter analizzare, includere uno spazio dopo l'apertura parentesi graffa.
Risposte:
{}
{ list; }
Posizionare un elenco di comandi tra parentesi graffe fa sì che l'elenco venga eseguito nel contesto della shell corrente. Non viene creata alcuna subshell. È richiesto il seguente punto e virgola (o newline).
Oltre alla creazione di una subshell, esiste una sottile differenza tra questi due costrutti a causa di ragioni storiche. Le parentesi graffe sono parole riservate, quindi devono essere separate dall'elenco da spazi vuoti o altri metacaratteri della shell. Le parentesi sono operatori e sono riconosciute come token separati dalla shell anche se non sono separate dalla lista dagli spazi bianchi.
// fonte
Penso che @rush possa dare una risposta corretta se fuorviante qui. Il fork-bomb definisce una funzione chiamata " :
". Il codice tra parentesi graffe non viene eseguito fino a quando la funzione non viene chiamata dall'ultimo " :
". Quindi le parentesi graffe come raggruppamento di comandi e le parentesi graffe come corpo funzione sono sintatticamente uguali ma hanno una semantica diversa.
Dallo stesso documento di @rush cita:
Si noti che per motivi storici, nell'uso più comune le parentesi graffe che circondano il corpo della funzione devono essere separate dal corpo da spazi vuoti o nuove righe. Questo perché le parentesi graffe sono parole riservate e vengono riconosciute come tali solo quando sono separate dall'elenco dei comandi da spazi bianchi o da un altro metacaratterio della shell. Inoltre, quando si usano le parentesi graffe, l'elenco deve essere chiuso da un punto e virgola, un '&' o una nuova riga.
function_body
è a compound_command
(più un facoltativo redirect_list
). Lo spazio è necessario perché {
è una parola riservata, non un carattere speciale.
brace_group
comportano diversamente quando fanno parte di una funzione e quando no. Stavo usando il raggruppamento di comandi per descrivere quest'ultimo caso e questo è ciò che è stato descritto nel link di rush.
{
non è un operatore ma una parola riservata, e le parole devono essere separate da altre parole per essere considerate distinte.