Definicja funkcji powłoki: dlaczego po nawiasie otwierającym jest spacja?

18

Prawdopodobnie znasz tę bombę widelcową :

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

Zastanawiam się, dlaczego konieczne jest, aby parsować, aby wstawić spację po otwierającym nawiasie klamrowym.

Benoit
źródło

Odpowiedzi:

13

{}

          { list; }

Umieszczenie listy poleceń między nawiasami klamrowymi powoduje, że lista jest wykonywana w bieżącym kontekście powłoki. Nie jest tworzona podpowłoka. Wymagana jest następująca lista średników (lub znaków nowej linii).

Oprócz stworzenia podpowłoki istnieje subtelna różnica między tymi dwoma konstrukcjami z powodów historycznych. Nawiasy klamrowe są słowami zastrzeżonymi, więc muszą być oddzielone od listy spacjami lub innymi metaznakami powłoki. Nawiasy są operatorami i są rozpoznawane przez powłokę jako oddzielne tokeny, nawet jeśli nie są oddzielone od listy spacją.

// źródło

wysypka
źródło
1
Poddałem się twojej odpowiedzi w moim poście na tej stronie. To funkcja, a nie grupowanie poleceń.
donothings udane
3
@donothingsuccessfully Ciało funkcyjne to grupa poleceń.
Gilles „SO- przestań być zły”
3

Myślę, że @ rush może udzielić tutaj poprawnej, jeśli wprowadzającej w błąd odpowiedzi. Widelec-bomba definiuje funkcję o nazwie „ :”. Kod w nawiasach klamrowych nie jest wykonywany, dopóki funkcja nie zostanie wywołana przez końcowe „ :”. Tak więc nawiasy klamrowe jako grupa poleceń i nawiasy klamrowe jako ciało funkcyjne są składniowo takie same, ale mają inną semantykę.
Z tego samego dokumentu co przywołuje @rush:

Należy pamiętać, że ze względów historycznych w najczęściej używanym nawiasach klamrowych otaczających ciało funkcji należy oddzielić puste elementy lub znaki nowej linii. Wynika to z tego, że nawiasy klamrowe są słowami zastrzeżonymi i są rozpoznawane jako takie tylko wtedy, gdy są oddzielone od listy poleceń spacją lub innym metaznakiem powłoki. Ponadto podczas korzystania z nawiasów klamrowych lista musi być zakończona średnikiem, znakiem „&” lub znakiem nowej linii.

z powodzeniem
źródło
3
Nie, odpowiedź Rush jest poprawna. Nawiasy klamrowe wokół ciała funkcji są takim samym elementem składniowym, jak wtedy, gdy nie są rozdzielane ciałem funkcji. Zobacz zasady gramatyki powłoki : a function_bodyto a compound_command(plus opcjonalne redirect_list). Spacja jest potrzebna, ponieważ {jest to słowo zastrzeżone, a nie znak specjalny.
Gilles „SO- przestań być zły”
Tak, jak powiedziałem, odpowiedź Rush jest poprawna. Tak, są składniowo takie same, jak powiedziałem. Ale brace_groupzachowują się inaczej, gdy są częścią funkcji, a kiedy nie. Użyłem grupowania poleceń, aby opisać ten ostatni przypadek, i to właśnie opisano w linku Rusha.
dotacje zakończone sukcesem
2
Nie jestem pewien, czy rozróżnienie semantyczne jest tutaj istotne, ponieważ składnia ma znaczenie dla parsera. Prawdziwa odpowiedź {nie jest operatorem, lecz słowem zastrzeżonym, a słowa należy oddzielić od innych słów, aby można je było uznać za odrębne.
jw013,