Definizione della funzione di shell: perché c'è uno spazio dopo la parentesi graffa di apertura?


18

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:


13

{}

          { 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


1
Ho frugato con la tua risposta nel mio post su questa pagina. È una funzione non un raggruppamento di comandi.
donothings successo

3
@donothingsuccessfully Un corpo di funzione è un raggruppamento di comandi.
Gilles 'SO- smetti di essere malvagio' il

3

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.


3
No, la risposta di rush è corretta. Le parentesi graffe attorno a un corpo di funzione sono lo stesso elemento sintattico di quando non sono delimitate da un corpo di funzione. Vedi le regole grammaticali della shell : a function_bodyè a compound_command(più un facoltativo redirect_list). Lo spazio è necessario perché {è una parola riservata, non un carattere speciale.
Gilles 'SO- smetti di essere cattivo' il

Sì, la risposta di rush è corretta, come ho detto. Sì, sono sintatticamente uguali, come ho detto. Ma si brace_groupcomportano 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.
donothings successo

2
Non sono sicuro che la distinzione semantica sia significativa qui, poiché è la sintassi che conta per il parser. La vera risposta {non è un operatore ma una parola riservata, e le parole devono essere separate da altre parole per essere considerate distinte.
jw013,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.