Prawdopodobnie znasz tę bombę widelcową :
:(){ :|:&};: #WARNING: harmful code
Zastanawiam się, dlaczego konieczne jest, aby parsować, aby wstawić spację po otwierającym nawiasie klamrowym.
Prawdopodobnie znasz tę bombę widelcową :
:(){ :|:&};: #WARNING: harmful code
Zastanawiam się, dlaczego konieczne jest, aby parsować, aby wstawić spację po otwierającym nawiasie klamrowym.
Odpowiedzi:
{}
{ 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
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.
function_body
to a compound_command
(plus opcjonalne redirect_list
). Spacja jest potrzebna, ponieważ {
jest to słowo zastrzeżone, a nie znak specjalny.
brace_group
zachowują 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.
{
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.